L2JMobius

High Five players still return to level 1

kinghanker · 4 · 1932

Offline kinghanker

  • Knight
  • ***
    • Posts: 64
Reference: https://l2jmobius.org/forum/index.php?topic=8224.0

The solution shown in the mentioned topic did not solve the char issue back to level .
After some time the char returned to level 1, lost all skills and still had the same problem with the player's pet
We have the solution: it's not very polished but it solved the problem, we've been 2 weeks without any players regarding this problem

Code: [Select]
--- a/java/org/l2jmobius/gameserver/data/xml/ExperienceData.java
+++ b/java/org/l2jmobius/gameserver/data/xml/ExperienceData.java
@@ -36,6 +36,7 @@ public class ExperienceData implements IXmlReader
 
  private byte MAX_LEVEL;
  private byte MAX_PET_LEVEL;
+ private final byte PLAYER_LEVEL = 86;
+      private final byte PET_LEVEL = 87;
 
  /**
  * Instantiates a new experience table.
@@ -62,13 +63,30 @@ public class ExperienceData implements IXmlReader
  final NamedNodeMap tableAttr = table.getAttributes();
  MAX_LEVEL = (byte) (Byte.parseByte(tableAttr.getNamedItem("maxLevel").getNodeValue()) + 1);
  MAX_PET_LEVEL = (byte) (Byte.parseByte(tableAttr.getNamedItem("maxPetLevel").getNodeValue()) + 1);
+ if (MAX_LEVEL > PLAYER_LEVEL)
+ {
+ MAX_LEVEL = PLAYER_LEVEL;
+ }
+ if (MAX_PET_LEVEL > MAX_LEVEL)
+ {
+ MAX_PET_LEVEL = PET_LEVEL; // Pet level should not exceed owner level.
+ }
+
+ int maxLevel = 0;
  for (Node n = table.getFirstChild(); n != null; n = n.getNextSibling())
  {
- if ("experience".equals(n.getNodeName()))
+ if (!"experience".equals(n.getNodeName()))
  {
- final NamedNodeMap attrs = n.getAttributes();
- _expTable.put(parseInteger(attrs, "level"), parseLong(attrs, "tolevel"));
+ continue;
  }
+
+ final NamedNodeMap attrs = n.getAttributes();
+ maxLevel = Math.abs(parseInteger(attrs, "level"));
+ if (maxLevel > PLAYER_LEVEL)
+ {
+ break;
+ }
+ _expTable.put(maxLevel, parseLong(attrs, "tolevel"));
  }
  }
 
@@ -79,20 +97,11 @@ public class ExperienceData implements IXmlReader
  */
  public long getExpForLevel(int level)
  {
- if (level <= 0)
+ if (level > MAX_LEVEL)
  {
- LOGGER.warning(getClass().getSimpleName() + ": Requested exp for level " + level);
- return 0;
+ return _expTable.get(Integer.valueOf(MAX_LEVEL)).longValue();
  }
-
- final Long exp = _expTable.get(level);
- if (exp == null)
- {
- LOGGER.warning(getClass().getSimpleName() + ": Requested exp for level " + level);
- return _expTable.get((int) MAX_LEVEL);
- }
-
- return exp.longValue();
+ return _expTable.get(Integer.valueOf(level)).longValue();
  }
 
  /**

Hope this helps


Online Mobius

  • Distinguished King
  • *****
    • Posts: 16010
This code is used on other branches.
Code: [Select]
Index: dist/game/config/Character.ini
===================================================================
--- dist/game/config/Character.ini (revision 10148)
+++ dist/game/config/Character.ini (working copy)
@@ -367,6 +367,12 @@
 # Default: 2147483647
 MaxSp = 2000000000
 
+# Maximum Player Level
+# WARNING: Cannot exceed the maximum experince.xml level.
+# Example: Set as 80 to force the maximum player level at 80.
+# Default: 85
+MaximumPlayerLevel = 85
+
 # Maximum number of allowed subclasses for every player.
 # Default: 3
 MaxSubclass = 3
Index: java/org/l2jmobius/Config.java
===================================================================
--- java/org/l2jmobius/Config.java (revision 10148)
+++ java/org/l2jmobius/Config.java (working copy)
@@ -213,6 +213,7 @@
  public static int MIN_ABNORMAL_STATE_SUCCESS_RATE;
  public static int MAX_ABNORMAL_STATE_SUCCESS_RATE;
  public static long MAX_SP;
+ public static byte PLAYER_MAXIMUM_LEVEL;
  public static byte MAX_SUBCLASS;
  public static byte BASE_SUBCLASS_LEVEL;
  public static byte MAX_SUBCLASS_LEVEL;
@@ -1772,6 +1773,8 @@
  MIN_ABNORMAL_STATE_SUCCESS_RATE = characterConfig.getInt("MinAbnormalStateSuccessRate", 10);
  MAX_ABNORMAL_STATE_SUCCESS_RATE = characterConfig.getInt("MaxAbnormalStateSuccessRate", 90);
  MAX_SP = characterConfig.getLong("MaxSp", 50000000000L) >= 0 ? characterConfig.getLong("MaxSp", 50000000000L) : Long.MAX_VALUE;
+ PLAYER_MAXIMUM_LEVEL = characterConfig.getByte("MaximumPlayerLevel", (byte) 85);
+ PLAYER_MAXIMUM_LEVEL++;
  MAX_SUBCLASS = characterConfig.getByte("MaxSubclass", (byte) 3);
  BASE_SUBCLASS_LEVEL = characterConfig.getByte("BaseSubclassLevel", (byte) 40);
  MAX_SUBCLASS_LEVEL = characterConfig.getByte("MaxSubclassLevel", (byte) 80);
Index: java/org/l2jmobius/gameserver/data/xml/ExperienceData.java
===================================================================
--- java/org/l2jmobius/gameserver/data/xml/ExperienceData.java (revision 10070)
+++ java/org/l2jmobius/gameserver/data/xml/ExperienceData.java (working copy)
@@ -19,11 +19,13 @@
 import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.logging.Logger;
 
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 
+import org.l2jmobius.Config;
 import org.l2jmobius.commons.util.IXmlReader;
 
 /**
@@ -32,6 +34,8 @@
  */
 public class ExperienceData implements IXmlReader
 {
+ private static final Logger LOGGER = Logger.getLogger(ExperienceData.class.getName());
+
  private final Map<Integer, Long> _expTable = new HashMap<>();
 
  private byte MAX_LEVEL;
@@ -62,12 +66,27 @@
  final NamedNodeMap tableAttr = table.getAttributes();
  MAX_LEVEL = (byte) (Byte.parseByte(tableAttr.getNamedItem("maxLevel").getNodeValue()) + 1);
  MAX_PET_LEVEL = (byte) (Byte.parseByte(tableAttr.getNamedItem("maxPetLevel").getNodeValue()) + 1);
+ if (MAX_LEVEL > Config.PLAYER_MAXIMUM_LEVEL)
+ {
+ MAX_LEVEL = Config.PLAYER_MAXIMUM_LEVEL;
+ }
+ if (MAX_PET_LEVEL > MAX_LEVEL)
+ {
+ MAX_PET_LEVEL = MAX_LEVEL; // Pet level should not exceed owner level.
+ }
+
+ int maxLevel = 0;
  for (Node n = table.getFirstChild(); n != null; n = n.getNextSibling())
  {
  if ("experience".equals(n.getNodeName()))
  {
  final NamedNodeMap attrs = n.getAttributes();
- _expTable.put(parseInteger(attrs, "level"), parseLong(attrs, "tolevel"));
+ maxLevel = parseInteger(attrs, "level");
+ if (maxLevel > Config.PLAYER_MAXIMUM_LEVEL)
+ {
+ break;
+ }
+ _expTable.put(maxLevel, parseLong(attrs, "tolevel"));
  }
  }
  }
@@ -79,20 +98,11 @@
  */
  public long getExpForLevel(int level)
  {
- if (level <= 0)
+ if (level > Config.PLAYER_MAXIMUM_LEVEL)
  {
- LOGGER.warning(getClass().getSimpleName() + ": Requested exp for level " + level);
- return 0;
+ return _expTable.get((int) Config.PLAYER_MAXIMUM_LEVEL);
  }
-
- final Long exp = _expTable.get(level);
- if (exp == null)
- {
- LOGGER.warning(getClass().getSimpleName() + ": Requested exp for level " + level);
- return _expTable.get((int) MAX_LEVEL);
- }
-
- return exp.longValue();
+ return _expTable.get(level);
  }
 
  /**


Offline Susuy

  • Heir
  • **
    • Posts: 32
i saw this code at ertheia brunch, it really works