L2JMobius

Master Class Ch. 3 Fixed AdminLevel not working correctly with premium EXP multipliers.

realAprox · 5 · 1079

Offline realAprox

  • Heir
  • **
    • Posts: 10
  • Pip Pip The Diddly Doo
    • YouTube
What title says
Command //set_level was giving double exp to targets with premium resulting in inaccurate levelups.
(eg. targeting lvl 1 character and using //set_level 2 would make target lvl 8..)

EDIT:
Found the same thing with //add_exp_sp. Update soon...

UPDATE:
solved.
Diff:
Code: [Select]
diff --git a/L2J_Mobius_10.3_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java b/L2J_Mobius_10.3_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java
index 18ba0cc..35a2f2a 100644
--- a/L2J_Mobius_10.3_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java
+++ b/L2J_Mobius_10.3_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java
@@ -143,6 +143,11 @@
  if ((expval != 0) || (spval != 0))
  {
  // Common character information
+ if (player.hasPremiumStatus())
+ {
+ expval = player.premiumBonusExpBypass(expval);
+ spval = player.premiumBonusExpBypass(spval);
+ }
  player.sendMessage("Admin is adding you " + expval + " xp and " + spval + " sp.");
  player.addExpAndSp(expval, spval);
  // Admin information
diff --git a/L2J_Mobius_10.3_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java b/L2J_Mobius_10.3_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java
index e1d98b5..1e86905 100644
--- a/L2J_Mobius_10.3_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java
+++ b/L2J_Mobius_10.3_MasterClass/dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java
@@ -83,6 +83,7 @@
  {
  final long pXp = targetPlayer.getExp();
  final long tXp = ExperienceData.getInstance().getExpForLevel(level);
+ long additiveExp = tXp - pXp;
  if (pXp > tXp)
  {
  targetPlayer.getStat().setLevel(level);
@@ -91,8 +92,12 @@
  }
  else if (pXp < tXp)
  {
- targetPlayer.addExpAndSp(tXp - pXp, 0);
- BuilderUtil.sendSysMessage(activeChar, "Added " + (tXp - pXp) + " exp.");
+ if (targetPlayer.hasPremiumStatus())
+ {
+ additiveExp = targetPlayer.premiumBonusExpBypass(additiveExp);
+ }
+ targetPlayer.addExpAndSp(additiveExp, 0);
+ BuilderUtil.sendSysMessage(activeChar, "Added " + additiveExp + " exp.");
  }
  targetPlayer.setCurrentHpMp(targetPlayer.getMaxHp(), targetPlayer.getMaxMp());
  targetPlayer.setCurrentCp(targetPlayer.getMaxCp());
diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java
index a812830..4b5bcd8 100644
--- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java
+++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java
@@ -15247,4 +15247,14 @@
  {
  _heroBookInfo = holder;
  }
+
+ // Bypass premium bonus EXP multiplier. Only used by admin_set_level and admin_add_exp_sp
+ public long premiumBonusExpBypass(long val)
+ {
+ long addValue = val;
+ final double pExpRate = Config.PREMIUM_RATE_XP; // Get premium EXP multiplier
+ addValue = Math.round(addValue / pExpRate);
+ addValue = addValue >= 1 ? addValue : 1;
+ return addValue;
+ }
 }


Online Mobius

  • Distinguished King
  • *****
    • Posts: 16152
spval = player.premiumBonusExpBypass(spval);
::)

Also I avoid to add new Player methods.
If anything Player needs to be cleaned from many methods that can be moved to other classes.


Offline realAprox

  • Heir
  • **
    • Posts: 10
  • Pip Pip The Diddly Doo
    • YouTube
spval = player.premiumBonusExpBypass(spval);
::)

Also I avoid to add new Player methods.
If anything Player needs to be cleaned from many methods that can be moved to other classes.

true, could have as well been a local function


Online Mobius

  • Distinguished King
  • *****
    • Posts: 16152
More like this.
Code: [Select]
Index: dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java
===================================================================
--- dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java (revision 11955)
+++ dist/game/data/scripts/handlers/admincommandhandlers/AdminExpSp.java (working copy)
@@ -18,6 +18,7 @@
 
 import java.util.StringTokenizer;
 
+import org.l2jmobius.Config;
 import org.l2jmobius.gameserver.data.xml.ClassListData;
 import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
 import org.l2jmobius.gameserver.model.WorldObject;
@@ -144,7 +145,14 @@
  {
  // Common character information
  player.sendMessage("Admin is adding you " + expval + " xp and " + spval + " sp.");
- player.addExpAndSp(expval, spval);
+ if (player.hasPremiumStatus())
+ {
+ player.addExpAndSp((long) (expval / Config.PREMIUM_RATE_XP), (long) (spval / Config.PREMIUM_RATE_SP));
+ }
+ else
+ {
+ player.addExpAndSp(expval, spval);
+ }
  // Admin information
  BuilderUtil.sendSysMessage(activeChar, "Added " + expval + " xp and " + spval + " sp to " + player.getName() + ".");
  }
Index: dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java
===================================================================
--- dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java (revision 11955)
+++ dist/game/data/scripts/handlers/admincommandhandlers/AdminLevel.java (working copy)
@@ -91,8 +91,16 @@
  }
  else if (pXp < tXp)
  {
- targetPlayer.addExpAndSp(tXp - pXp, 0);
- BuilderUtil.sendSysMessage(activeChar, "Added " + (tXp - pXp) + " exp.");
+ final long requiredExp = tXp - pXp;
+ if (targetPlayer.hasPremiumStatus())
+ {
+ targetPlayer.addExpAndSp((long) (requiredExp / Config.PREMIUM_RATE_XP), 0);
+ }
+ else
+ {
+ targetPlayer.addExpAndSp(requiredExp, 0);
+ }
+ BuilderUtil.sendSysMessage(activeChar, "Added " + requiredExp + " exp.");
  }
  targetPlayer.setCurrentHpMp(targetPlayer.getMaxHp(), targetPlayer.getMaxMp());
  targetPlayer.setCurrentCp(targetPlayer.getMaxCp());

Note to myself:
This is not needed with subscriber version.
Premium bonuses are calculated differently.


Offline realAprox

  • Heir
  • **
    • Posts: 10
  • Pip Pip The Diddly Doo
    • YouTube