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));
}