diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/config/Character.ini b/L2J_Mobius_01.0_Ertheia/dist/game/config/Character.ini index eeaf022244..8ff4dab335 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/config/Character.ini +++ b/L2J_Mobius_01.0_Ertheia/dist/game/config/Character.ini @@ -315,6 +315,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java index 4f232ab070..4b4d6d3d18 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -328,6 +328,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_01.0_Ertheia/dist/game/data/stats/skills/documentation.txt index 06f563d514..6550b5db2b 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/stats/skills/documentation.txt @@ -297,6 +297,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java index ce56da0f17..f0f0160d80 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java @@ -200,6 +200,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1765,6 +1766,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index cf84c07a62..73d9ad393d 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -327,7 +327,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -335,7 +345,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -343,7 +353,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -351,7 +361,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -359,7 +369,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 678412218a..b11725c93f 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; public class PlayableStat extends CreatureStat @@ -254,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Stat.java index be7e1eb712..dedd0d6dfb 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -164,6 +164,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_02.5_Underground/dist/game/config/Character.ini b/L2J_Mobius_02.5_Underground/dist/game/config/Character.ini index 6b26b61be8..5897b96dda 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/config/Character.ini +++ b/L2J_Mobius_02.5_Underground/dist/game/config/Character.ini @@ -315,6 +315,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java index 4f232ab070..4b4d6d3d18 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -328,6 +328,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_02.5_Underground/dist/game/data/stats/skills/documentation.txt index 06f563d514..6550b5db2b 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_02.5_Underground/dist/game/data/stats/skills/documentation.txt @@ -297,6 +297,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java index 332af96e61..726cce0627 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java @@ -207,6 +207,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1785,6 +1786,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index cf84c07a62..73d9ad393d 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -327,7 +327,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -335,7 +345,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -343,7 +353,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -351,7 +361,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -359,7 +369,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 678412218a..b11725c93f 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; public class PlayableStat extends CreatureStat @@ -254,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/stats/Stat.java index be7e1eb712..dedd0d6dfb 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -164,6 +164,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_03.0_Helios/dist/game/config/Character.ini b/L2J_Mobius_03.0_Helios/dist/game/config/Character.ini index 6b26b61be8..5897b96dda 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/config/Character.ini +++ b/L2J_Mobius_03.0_Helios/dist/game/config/Character.ini @@ -315,6 +315,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java index 4f232ab070..4b4d6d3d18 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -328,6 +328,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_03.0_Helios/dist/game/data/stats/skills/documentation.txt index 06f563d514..6550b5db2b 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_03.0_Helios/dist/game/data/stats/skills/documentation.txt @@ -297,6 +297,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java index d6959e5417..dfe17889e6 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java @@ -207,6 +207,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1798,6 +1799,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index cf84c07a62..73d9ad393d 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -327,7 +327,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -335,7 +345,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -343,7 +353,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -351,7 +361,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -359,7 +369,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 678412218a..b11725c93f 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; public class PlayableStat extends CreatureStat @@ -254,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/stats/Stat.java index be7e1eb712..dedd0d6dfb 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -164,6 +164,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/config/Character.ini b/L2J_Mobius_04.0_GrandCrusade/dist/game/config/Character.ini index 1023449a9c..3261c36a79 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/config/Character.ini +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/config/Character.ini @@ -315,6 +315,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java index 0ab4cce3d2..5d11e2e4ad 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -333,6 +333,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt index d35a53a9b1..fdfd05596f 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/stats/skills/documentation.txt @@ -302,6 +302,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java index 2fda2748c1..b98f26f905 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java @@ -207,6 +207,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1785,6 +1786,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index cf84c07a62..73d9ad393d 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -327,7 +327,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -335,7 +345,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -343,7 +353,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -351,7 +361,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -359,7 +369,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 678412218a..b11725c93f 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; public class PlayableStat extends CreatureStat @@ -254,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Stat.java index 9b69f1e6bc..d007925d19 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -164,6 +164,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_05.0_Salvation/dist/game/config/Character.ini b/L2J_Mobius_05.0_Salvation/dist/game/config/Character.ini index 8b58d24305..f19c93f28d 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/config/Character.ini +++ b/L2J_Mobius_05.0_Salvation/dist/game/config/Character.ini @@ -315,6 +315,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java index 27bac64a77..eb09091dc1 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -338,6 +338,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_05.0_Salvation/dist/game/data/stats/skills/documentation.txt index 91849e22e9..6297fea43d 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/stats/skills/documentation.txt @@ -307,6 +307,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java index 8f004e5965..215f30e68b 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java @@ -214,6 +214,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1794,6 +1795,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index cf84c07a62..73d9ad393d 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -327,7 +327,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -335,7 +345,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -343,7 +353,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -351,7 +361,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -359,7 +369,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 678412218a..b11725c93f 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; public class PlayableStat extends CreatureStat @@ -254,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Stat.java index 5a6836c1c2..8fdb8000ae 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -167,6 +167,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/config/Character.ini b/L2J_Mobius_05.5_EtinasFate/dist/game/config/Character.ini index 8b58d24305..f19c93f28d 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/config/Character.ini +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/config/Character.ini @@ -315,6 +315,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java index b22f420b93..748731f653 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -339,6 +339,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_05.5_EtinasFate/dist/game/data/stats/skills/documentation.txt index 50f8122da4..e538359b55 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/stats/skills/documentation.txt @@ -308,6 +308,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java index 327a349dec..9a8612380e 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java @@ -214,6 +214,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1801,6 +1802,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index cf84c07a62..73d9ad393d 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -327,7 +327,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -335,7 +345,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -343,7 +353,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -351,7 +361,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -359,7 +369,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 678412218a..b11725c93f 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; public class PlayableStat extends CreatureStat @@ -254,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Stat.java index b79755260e..6df8233361 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -167,6 +167,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/config/Character.ini b/L2J_Mobius_06.0_Fafurion/dist/game/config/Character.ini index eecb622e52..dbbfc52676 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/config/Character.ini +++ b/L2J_Mobius_06.0_Fafurion/dist/game/config/Character.ini @@ -319,6 +319,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999999 MaxPAtk = 999999999 diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/EffectMasterHandler.java index b22f420b93..748731f653 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -339,6 +339,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_06.0_Fafurion/dist/game/data/stats/skills/documentation.txt index 50f8122da4..e538359b55 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/stats/skills/documentation.txt @@ -308,6 +308,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java index a91529dc86..4ea2a41dac 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java @@ -215,6 +215,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1836,6 +1837,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index cf84c07a62..73d9ad393d 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -327,7 +327,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -335,7 +345,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -343,7 +353,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -351,7 +361,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -359,7 +369,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 678412218a..b11725c93f 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; public class PlayableStat extends CreatureStat @@ -254,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Stat.java index b79755260e..6df8233361 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -167,6 +167,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/Character.ini b/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/Character.ini index 1ad1920798..c11653ab35 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/Character.ini +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/Character.ini @@ -329,6 +329,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999999 MaxPAtk = 999999999 diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java index 9f6d6b9c6a..621226b271 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -339,6 +339,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt index ae39cc0285..6eedb4d8c6 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt @@ -307,6 +307,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java index bd23826014..566643137c 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java @@ -215,6 +215,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1846,6 +1847,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index cf84c07a62..73d9ad393d 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -327,7 +327,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -335,7 +345,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -343,7 +353,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -351,7 +361,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -359,7 +369,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 7dd70aa301..c35b7b1fb2 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -255,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return (weapon != null ? weapon.getBaseAttackAngle() + (int) getActiveChar().getStat().getValue(Stat.WEAPON_ATTACK_ANGLE_BONUS, 0) : super.getPhysicalAttackAngle()); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/Stat.java index bb815e784c..531e3c5c19 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -168,6 +168,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/config/Character.ini b/L2J_Mobius_08.2_Homunculus/dist/game/config/Character.ini index a8d5df94d7..cb2515b637 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/config/Character.ini +++ b/L2J_Mobius_08.2_Homunculus/dist/game/config/Character.ini @@ -329,6 +329,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999999 MaxPAtk = 999999999 diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/EffectMasterHandler.java index 46004d8ef1..ae05e05dfc 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -341,6 +341,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_08.2_Homunculus/dist/game/data/stats/skills/documentation.txt index 9e02f9ee88..60fb337696 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/stats/skills/documentation.txt @@ -309,6 +309,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java index cde6decb8d..f4ab291636 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java @@ -215,6 +215,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1844,6 +1845,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 04cd1fb1df..a7a38eb6bc 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -332,7 +332,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -340,7 +350,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -348,7 +358,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -356,7 +366,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -364,7 +374,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 6c2c9fcd61..be8cc356d8 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -255,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return (weapon != null ? weapon.getBaseAttackAngle() + (int) getActiveChar().getStat().getValue(Stat.WEAPON_ATTACK_ANGLE_BONUS, 0) : super.getPhysicalAttackAngle()); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/stats/Stat.java index 8d8771f155..7c8311dcce 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -173,6 +173,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index bba571606d..87f06d6fea 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -61,7 +61,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -69,7 +83,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/Character.ini b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/Character.ini index ec77f7765c..d37b76fb25 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/Character.ini +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/Character.ini @@ -329,6 +329,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999999 MaxPAtk = 999999999 diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/EffectMasterHandler.java index 39bba847a5..4ad6ef49c9 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -342,6 +342,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/stats/skills/documentation.txt index 670f703536..a01644e318 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/stats/skills/documentation.txt @@ -309,6 +309,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java index 62aba2df97..1dc62aff16 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java @@ -215,6 +215,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1846,6 +1847,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 04cd1fb1df..a7a38eb6bc 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -332,7 +332,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -340,7 +350,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -348,7 +358,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -356,7 +366,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -364,7 +374,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 6c2c9fcd61..be8cc356d8 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -255,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return (weapon != null ? weapon.getBaseAttackAngle() + (int) getActiveChar().getStat().getValue(Stat.WEAPON_ATTACK_ANGLE_BONUS, 0) : super.getPhysicalAttackAngle()); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/stats/Stat.java index 8d8771f155..7c8311dcce 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -173,6 +173,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index bba571606d..87f06d6fea 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -61,7 +61,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -69,7 +83,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/config/Character.ini b/L2J_Mobius_10.0_MasterClass/dist/game/config/Character.ini index ec77f7765c..d37b76fb25 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/config/Character.ini +++ b/L2J_Mobius_10.0_MasterClass/dist/game/config/Character.ini @@ -329,6 +329,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999999 MaxPAtk = 999999999 diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/EffectMasterHandler.java index 9510b99b90..9340e046ea 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -344,6 +344,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/documentation.txt index 7b668809d3..3b779c4442 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/stats/skills/documentation.txt @@ -311,6 +311,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/Config.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/Config.java index d457dc03c8..628520f70c 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/Config.java @@ -215,6 +215,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1846,6 +1847,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 04cd1fb1df..a7a38eb6bc 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -332,7 +332,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -340,7 +350,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -348,7 +358,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -356,7 +366,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -364,7 +374,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 6c2c9fcd61..be8cc356d8 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -255,4 +255,10 @@ public class PlayableStat extends CreatureStat final Weapon weapon = getActiveChar().getActiveWeaponItem(); return (weapon != null ? weapon.getBaseAttackAngle() + (int) getActiveChar().getStat().getValue(Stat.WEAPON_ATTACK_ANGLE_BONUS, 0) : super.getPhysicalAttackAngle()); } + + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } } diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/stats/Stat.java index 8d8771f155..7c8311dcce 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -173,6 +173,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index bba571606d..87f06d6fea 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -61,7 +61,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -69,7 +83,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Character.ini b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Character.ini index 99b1752e92..7775793463 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Character.ini +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 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 67dd0f10d4..c633439745 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 @@ -324,6 +324,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} 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 303e2285b3..ef76524dc8 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 @@ -293,6 +293,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java index e03eb8835f..680ed0b7ac 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java @@ -208,6 +208,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1732,6 +1733,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); 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 8f331376a0..a2e5edb144 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 @@ -317,7 +317,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -325,7 +335,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -333,7 +343,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -341,7 +351,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -349,7 +359,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index ab69ac3799..b656d4ec10 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; @@ -271,6 +272,12 @@ public class PlayableStat extends CreatureStat return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Stat.java index 36b2c82280..6b52c36e9c 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -163,6 +163,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/Character.ini b/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/Character.ini index 8e55d52c02..0cac75b2e9 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/Character.ini +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/EffectMasterHandler.java index 67dd0f10d4..c633439745 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -324,6 +324,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/documentation.txt index 303e2285b3..ef76524dc8 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/skills/documentation.txt @@ -293,6 +293,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java index 5fc621eded..92659cf6e9 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java @@ -208,6 +208,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1736,6 +1737,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); 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 8f331376a0..a2e5edb144 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 @@ -317,7 +317,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -325,7 +335,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -333,7 +343,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -341,7 +351,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -349,7 +359,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index ab69ac3799..b656d4ec10 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; @@ -271,6 +272,12 @@ public class PlayableStat extends CreatureStat return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Stat.java index 36b2c82280..6b52c36e9c 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -163,6 +163,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/Character.ini b/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/Character.ini index a2aff64c04..0ba6105985 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/Character.ini +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/EffectMasterHandler.java index cc1d7bdcd5..f5d9aa3162 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -326,6 +326,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/documentation.txt index 4b593af52d..d7ff377580 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/skills/documentation.txt @@ -295,6 +295,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java index 5fc621eded..92659cf6e9 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java @@ -208,6 +208,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1736,6 +1737,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); 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 8f331376a0..a2e5edb144 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 @@ -317,7 +317,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -325,7 +335,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -333,7 +343,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -341,7 +351,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -349,7 +359,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index ab69ac3799..b656d4ec10 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; @@ -271,6 +272,12 @@ public class PlayableStat extends CreatureStat return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Stat.java index da6c7497b8..5c252d6b82 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -166,6 +166,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/Character.ini b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/Character.ini index a2aff64c04..0ba6105985 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/Character.ini +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/EffectMasterHandler.java index 2de62a9096..282cd2d1d0 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -329,6 +329,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpiritExpModify", SpiritExpModify::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/documentation.txt index db9610ee0d..32ef8c1035 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/skills/documentation.txt @@ -298,6 +298,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java index 5fc621eded..92659cf6e9 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java @@ -208,6 +208,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1736,6 +1737,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); 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 8f331376a0..a2e5edb144 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 @@ -317,7 +317,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -325,7 +335,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -333,7 +343,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -341,7 +351,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -349,7 +359,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index ab69ac3799..b656d4ec10 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; @@ -271,6 +272,12 @@ public class PlayableStat extends CreatureStat return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Stat.java index 360f87caa7..daaf5c2180 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -179,6 +179,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/Character.ini b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/Character.ini index 9f307fdf9b..15c8746aea 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/Character.ini +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/EffectMasterHandler.java index 2de62a9096..282cd2d1d0 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -329,6 +329,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpiritExpModify", SpiritExpModify::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/stats/skills/documentation.txt index db9610ee0d..32ef8c1035 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/stats/skills/documentation.txt @@ -298,6 +298,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java index 7368ab9009..c0d754cadc 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java @@ -208,6 +208,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1741,6 +1742,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); 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 8f331376a0..a2e5edb144 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 @@ -317,7 +317,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -325,7 +335,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -333,7 +343,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -341,7 +351,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -349,7 +359,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index ab69ac3799..b656d4ec10 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; @@ -271,6 +272,12 @@ public class PlayableStat extends CreatureStat return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Stat.java index 360f87caa7..daaf5c2180 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -179,6 +179,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/Character.ini b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/Character.ini index 5517f3b789..9b2c2ee19c 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/Character.ini +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java index a1f8ef24f4..a9edd975a8 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -331,6 +331,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpiritExpModify", SpiritExpModify::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt index cc328db3d3..f11987e472 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt @@ -300,6 +300,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java index 172326cacb..c4bce39129 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java @@ -208,6 +208,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1747,6 +1748,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 8f331376a0..a2e5edb144 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -317,7 +317,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -325,7 +335,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -333,7 +343,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -341,7 +351,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -349,7 +359,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 1b3568357d..3812746e4e 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -272,6 +272,12 @@ public class PlayableStat extends CreatureStat return (weapon != null ? weapon.getBaseAttackAngle() + (int) getActiveChar().getStat().getValue(Stat.WEAPON_ATTACK_ANGLE_BONUS, 0) : super.getPhysicalAttackAngle()); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/Stat.java index 978e648034..0310ad84de 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -182,6 +182,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Classic_Interlude/dist/game/config/Character.ini b/L2J_Mobius_Classic_Interlude/dist/game/config/Character.ini index 0acf5578bc..9167d7c108 100644 --- a/L2J_Mobius_Classic_Interlude/dist/game/config/Character.ini +++ b/L2J_Mobius_Classic_Interlude/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/EffectMasterHandler.java index 2b8269f2e9..e4327aeeda 100644 --- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -327,6 +327,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("StatAddForLevel", StatAddForLevel::new); diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_Interlude/dist/game/data/stats/skills/documentation.txt index a4ee69f5ac..ec6d9ba27f 100644 --- a/L2J_Mobius_Classic_Interlude/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Classic_Interlude/dist/game/data/stats/skills/documentation.txt @@ -295,6 +295,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. StatAddForLevel: Adds a fixed amount of a Stat for a specific player level. (l2jmobius) diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java index cf59172ffc..5dfae2d18c 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java @@ -207,6 +207,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1739,6 +1740,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index 8f331376a0..a2e5edb144 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -317,7 +317,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -325,7 +335,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -333,7 +343,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -341,7 +351,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -349,7 +359,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index ab69ac3799..b656d4ec10 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged; import org.l2jmobius.gameserver.model.events.returns.TerminateReturn; import org.l2jmobius.gameserver.model.item.Weapon; +import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.variables.PlayerVariables; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ExNewSkillToLearnByLevelUp; @@ -271,6 +272,12 @@ public class PlayableStat extends CreatureStat return weapon != null ? weapon.getBaseAttackAngle() : super.getPhysicalAttackAngle(); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/Stat.java index 353e528971..54a24adb35 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -163,6 +163,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/Character.ini b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/Character.ini index 9dc8677ae3..b06b11c0ef 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/Character.ini +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/EffectMasterHandler.java index 1d6bd1a85e..c7d2ed2bd9 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -338,6 +338,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpiritExpModify", SpiritExpModify::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/stats/skills/documentation.txt index 557de9a78d..523a7089c7 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/stats/skills/documentation.txt @@ -307,6 +307,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java index 3e236fa602..3711307b21 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java @@ -210,6 +210,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1767,6 +1768,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index fe084eead5..d161a62c5d 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -322,7 +322,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -330,7 +340,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -338,7 +348,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -346,7 +356,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -354,7 +364,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 20ad33d1ae..43b0fa5461 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -272,6 +272,12 @@ public class PlayableStat extends CreatureStat return (weapon != null ? weapon.getBaseAttackAngle() + (int) getActiveChar().getStat().getValue(Stat.WEAPON_ATTACK_ANGLE_BONUS, 0) : super.getPhysicalAttackAngle()); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/stats/Stat.java index 3a22250416..3ec0d69666 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -188,6 +188,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/Character.ini b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/Character.ini index 9dc8677ae3..b06b11c0ef 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/Character.ini +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/EffectMasterHandler.java index 09c534eb01..53aad4ada9 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -340,6 +340,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpiritExpModify", SpiritExpModify::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/stats/skills/documentation.txt index 2603791ccf..46b85b0dd8 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/stats/skills/documentation.txt @@ -308,6 +308,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java index 0e1caed230..6e7a913580 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java @@ -210,6 +210,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1770,6 +1771,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index fe084eead5..d161a62c5d 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -322,7 +322,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -330,7 +340,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -338,7 +348,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -346,7 +356,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -354,7 +364,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index 20ad33d1ae..43b0fa5461 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -272,6 +272,12 @@ public class PlayableStat extends CreatureStat return (weapon != null ? weapon.getBaseAttackAngle() + (int) getActiveChar().getStat().getValue(Stat.WEAPON_ATTACK_ANGLE_BONUS, 0) : super.getPhysicalAttackAngle()); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/stats/Stat.java index 3a22250416..3ec0d69666 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -188,6 +188,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); } diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/config/Character.ini b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/config/Character.ini index 9dc8677ae3..b06b11c0ef 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/config/Character.ini +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/config/Character.ini @@ -234,6 +234,10 @@ MaxSpBonus = 0 # Default: 300 MaxRunSpeed = 300 +# Maximum summon running speed. +# Default: 350 +MaxRunSpeedSummon = 350 + # Maximum character Physical Attack. # Default: 999999 MaxPAtk = 999999 diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/EffectMasterHandler.java index f75fac7e68..6543dab8c1 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -342,6 +342,7 @@ public class EffectMasterHandler EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); + EffectHandler.getInstance().registerHandler("SpeedLimit", SpeedLimit::new); EffectHandler.getInstance().registerHandler("SpiritExpModify", SpiritExpModify::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java new file mode 100644 index 0000000000..41f395125a --- /dev/null +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/SpeedLimit.java @@ -0,0 +1,31 @@ +/* + * 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 org.l2jmobius.gameserver.model.StatSet; +import org.l2jmobius.gameserver.model.stats.Stat; + +/** + * @author dontknowdontcare + */ +public class SpeedLimit extends AbstractStatEffect +{ + public SpeedLimit(StatSet params) + { + super(params, Stat.SPEED_LIMIT); + } +} diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/stats/skills/documentation.txt index db31e70d71..1bffd02664 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/stats/skills/documentation.txt +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/stats/skills/documentation.txt @@ -309,6 +309,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count. Sow: Planting a seed into NPC target. Manor stuff. Speed: Speed stat. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. +SpeedLimit: Increase a character's max Speed limit. (l2jmobius) SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson) SpModify: Bonus SP stat. Spoil: Spoils a mob activating its extra sweep drop. diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/Config.java index 0e1caed230..6e7a913580 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/Config.java @@ -210,6 +210,7 @@ public class Config public static double MAX_BONUS_EXP; public static double MAX_BONUS_SP; public static int MAX_RUN_SPEED; + public static int MAX_RUN_SPEED_SUMMON; public static int MAX_PATK; public static int MAX_MATK; public static int MAX_PCRIT_RATE; @@ -1770,6 +1771,7 @@ public class Config MAX_BONUS_EXP = characterConfig.getDouble("MaxExpBonus", 0); MAX_BONUS_SP = characterConfig.getDouble("MaxSpBonus", 0); MAX_RUN_SPEED = characterConfig.getInt("MaxRunSpeed", 300); + MAX_RUN_SPEED_SUMMON = characterConfig.getInt("MaxRunSpeedSummon", 350); MAX_PATK = characterConfig.getInt("MaxPAtk", 999999); MAX_MATK = characterConfig.getInt("MaxMAtk", 999999); MAX_PCRIT_RATE = characterConfig.getInt("MaxPCritRate", 500); diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java index fe084eead5..d161a62c5d 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/CreatureStat.java @@ -322,7 +322,17 @@ public class CreatureStat { baseSpeed = _creature.getTemplate().getBaseValue(_creature.isRunning() ? Stat.RUN_SPEED : Stat.WALK_SPEED, 0); } - return getMoveSpeed() * (1. / baseSpeed); + return getMoveSpeed() * (1 / baseSpeed); + } + + protected double maxSpeed() + { + return 99999999; + } + + private double calcValidSpeed(final double val) + { + return Math.max(Math.min(val, maxSpeed() + getValue(Stat.SPEED_LIMIT)), 0); } /** @@ -330,7 +340,7 @@ public class CreatureStat */ public double getRunSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_RUN_SPEED : Stat.RUN_SPEED)); } /** @@ -338,7 +348,7 @@ public class CreatureStat */ public double getWalkSpeed() { - return getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED); + return calcValidSpeed(getValue(_creature.isInsideZone(ZoneId.WATER) ? Stat.SWIM_WALK_SPEED : Stat.WALK_SPEED)); } /** @@ -346,7 +356,7 @@ public class CreatureStat */ public double getSwimRunSpeed() { - return getValue(Stat.SWIM_RUN_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_RUN_SPEED)); } /** @@ -354,7 +364,7 @@ public class CreatureStat */ public double getSwimWalkSpeed() { - return getValue(Stat.SWIM_WALK_SPEED); + return calcValidSpeed(getValue(Stat.SWIM_WALK_SPEED)); } /** diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java index fecef82b02..378c3b4330 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/PlayableStat.java @@ -272,6 +272,12 @@ public class PlayableStat extends CreatureStat return (weapon != null ? weapon.getBaseAttackAngle() + (int) getActiveChar().getStat().getValue(Stat.WEAPON_ATTACK_ANGLE_BONUS, 0) : super.getPhysicalAttackAngle()); } + @Override + protected double maxSpeed() + { + return Config.MAX_RUN_SPEED + getValue(Stat.SPEED_LIMIT); + } + private void addReputationToClanBasedOnLevel(Player player, int leveledUpCount) { Clan clan = player.getClan(); diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java index 7b4c4d6176..1b9227199d 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/stat/SummonStat.java @@ -33,28 +33,8 @@ public class SummonStat extends PlayableStat } @Override - public double getRunSpeed() + protected double maxSpeed() { - final double val = super.getRunSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; - } - - @Override - public double getWalkSpeed() - { - final double val = super.getWalkSpeed() + Config.RUN_SPD_BOOST; - - // Apply max run speed cap. - if (val > (Config.MAX_RUN_SPEED + 50)) // In retail maximum run speed is 350 for summons and 300 for players - { - return Config.MAX_RUN_SPEED + 50; - } - return val; + return Config.MAX_RUN_SPEED_SUMMON; } } diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/stats/Stat.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/stats/Stat.java index 56f8bef8a3..85ca0e81a7 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/stats/Stat.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/stats/Stat.java @@ -188,6 +188,7 @@ public enum Stat // Run speed, walk & escape speed are calculated proportionally, magic speed is a buff MOVE_SPEED("moveSpeed"), + SPEED_LIMIT("speedLimit"), RUN_SPEED("runSpd", new SpeedFinalizer()), WALK_SPEED("walkSpd", new SpeedFinalizer()), SWIM_RUN_SPEED("fastSwimSpd", new SpeedFinalizer()), diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java index 35e7b6aec2..a010d20921 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/stats/finalizers/SpeedFinalizer.java @@ -42,7 +42,7 @@ public class SpeedFinalizer implements IStatFunction throwIfPresent(base); double baseValue = getBaseSpeed(creature, stat); - if (creature.isPlayer()) + if (creature.isPlayable()) { // Enchanted feet bonus baseValue += calcEnchantBodyPart(creature, ItemTemplate.SLOT_FEET); @@ -56,7 +56,21 @@ public class SpeedFinalizer implements IStatFunction baseValue += bonusDex; } - return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, creature.isPlayable() ? Config.MAX_RUN_SPEED : Double.MAX_VALUE); + final double maxSpeed; + if (creature.isPlayer()) + { + maxSpeed = Config.MAX_RUN_SPEED + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else if (creature.isSummon()) + { + maxSpeed = Config.MAX_RUN_SPEED_SUMMON + creature.getStat().getValue(Stat.SPEED_LIMIT, 0); + } + else + { + maxSpeed = Double.MAX_VALUE; + } + + return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 0, maxSpeed); } @Override @@ -64,7 +78,7 @@ public class SpeedFinalizer implements IStatFunction { if (isBlessed) { - return (1 * Math.max(enchantLevel - 3, 0)) + (1 * Math.max(enchantLevel - 6, 0)); + return Math.max(enchantLevel - 3, 0) + Math.max(enchantLevel - 6, 0); } return (0.6 * Math.max(enchantLevel - 3, 0)) + (0.6 * Math.max(enchantLevel - 6, 0)); }