Răsfoiți Sursa

Physical attack speed, magical attack speed and evasion capped to match retail.
Configurable through Character.properties. Thanks GodKratos.

DrHouse 16 ani în urmă
părinte
comite
042b9af1b2

+ 12 - 0
L2_GameServer/java/config/Character.properties

@@ -214,6 +214,18 @@ MaxPCritRate = 500
 # Retail: 300
 MaxMCritRate = 200
 
+# Maximum character Attack Speed.
+# Retail: 1500
+MaxPAtkSpeed = 1500
+
+# Maximum character Cast Speed.
+# Retail: 1999
+MaxMAtkSpeed = 1999
+
+# Maximum character Evasion.
+# Retail: 200
+MaxEvasion = 200
+
 # Maximum number of allowed subclasses for every player.
 # Retail: 3
 MaxSubclass = 3

+ 6 - 0
L2_GameServer/java/net/sf/l2j/Config.java

@@ -128,6 +128,9 @@ public final class Config
     public static int		MAX_RUN_SPEED;
     public static int		MAX_PCRIT_RATE;
     public static int		MAX_MCRIT_RATE;
+    public static int		MAX_PATK_SPEED;
+    public static int		MAX_MATK_SPEED;
+    public static int		MAX_EVASION;
     public static byte		MAX_SUBCLASS;
     public static int		MAX_PVTSTORESELL_SLOTS_DWARF;
     public static int		MAX_PVTSTORESELL_SLOTS_OTHER;
@@ -1145,6 +1148,9 @@ public final class Config
                 MAX_RUN_SPEED						= Integer.parseInt(Character.getProperty("MaxRunSpeed", "250"));
                 MAX_PCRIT_RATE						= Integer.parseInt(Character.getProperty("MaxPCritRate", "500"));
                 MAX_MCRIT_RATE						= Integer.parseInt(Character.getProperty("MaxMCritRate", "200"));
+                MAX_PATK_SPEED						= Integer.parseInt(Character.getProperty("MaxPAtkSpeed", "1500"));
+                MAX_MATK_SPEED						= Integer.parseInt(Character.getProperty("MaxMAtkSpeed", "1999"));
+                MAX_EVASION							= Integer.parseInt(Character.getProperty("MaxEvasion", "200"));
                 MAX_SUBCLASS						= Byte.parseByte(Character.getProperty("MaxSubclass", "3"));
                 MAX_PVTSTORESELL_SLOTS_DWARF		= Integer.parseInt(Character.getProperty("MaxPvtStoreSellSlotsDwarf", "4"));
                 MAX_PVTSTORESELL_SLOTS_OTHER		= Integer.parseInt(Character.getProperty("MaxPvtStoreSellSlotsOther", "3"));

+ 10 - 2
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java

@@ -204,7 +204,10 @@ public class CharStat
     	if (_activeChar == null)
     		return 1;
 
-		return (int) (calcStat(Stats.EVASION_RATE, 0, target, null) / _activeChar.getArmourExpertisePenalty());
+		int val = (int) (calcStat(Stats.EVASION_RATE, 0, target, null) / _activeChar.getArmourExpertisePenalty());
+		if (val > Config.MAX_EVASION && !_activeChar.isGM())
+			val = Config.MAX_EVASION;
+		return val;
 	}
 
 	public long getExp()
@@ -370,6 +373,8 @@ public class CharStat
     		bonusSpdAtk = Config.L2JMOD_CHAMPION_SPD_ATK;
 		double val = calcStat(Stats.MAGIC_ATTACK_SPEED, _activeChar.getTemplate().baseMAtkSpd * bonusSpdAtk, null, null);
 		val /= _activeChar.getArmourExpertisePenalty();
+		if (val > Config.MAX_MATK_SPEED && !_activeChar.isGM())
+			val = Config.MAX_MATK_SPEED;
 		return (int) val;
 	}
 
@@ -523,7 +528,10 @@ public class CharStat
     	float bonusAtk = 1;
         if  (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
     		bonusAtk = Config.L2JMOD_CHAMPION_SPD_ATK;
-		return (int) (calcStat(Stats.POWER_ATTACK_SPEED, _activeChar.getTemplate().basePAtkSpd * bonusAtk, null, null) / _activeChar.getArmourExpertisePenalty());
+		int val = (int) (calcStat(Stats.POWER_ATTACK_SPEED, _activeChar.getTemplate().basePAtkSpd * bonusAtk, null, null) / _activeChar.getArmourExpertisePenalty());
+		if (val > Config.MAX_PATK_SPEED && !_activeChar.isGM())
+			val = Config.MAX_PATK_SPEED;
+		return val;
 	}
 
 	/** Return the PAtk Modifier against undead. */