Advertisement
Guest User

Untitled

a guest
May 24th, 2020
742
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.08 KB | None | 0 0
  1. package com.kabryxis.experienceeconomy;
  2.  
  3. import org.bukkit.entity.Player;
  4.  
  5. /**
  6.  * A utility for managing Player experience properly.
  7.  *
  8.  * @author Jikoo
  9.  */
  10. public class Experience {
  11.    
  12.     /**
  13.      * Calculates a player's total exp based on level and progress to next.
  14.      * @see http://minecraft.gamepedia.com/Experience#Leveling_up
  15.      *
  16.      * @param player the Player
  17.      *
  18.      * @return the amount of exp the Player has
  19.      */
  20.     public static int getExp(Player player) {
  21.         return getExpFromLevel(player.getLevel())
  22.                 + Math.round(getExpToNext(player.getLevel()) * player.getExp());
  23.     }
  24.    
  25.     /**
  26.      * Calculates total experience based on level.
  27.      *
  28.      * @see http://minecraft.gamepedia.com/Experience#Leveling_up
  29.      *
  30.      * "One can determine how much experience has been collected to reach a level using the equations:
  31.      *
  32.      *  Total Experience = [Level]2 + 6[Level] (at levels 0-15)
  33.      *                     2.5[Level]2 - 40.5[Level] + 360 (at levels 16-30)
  34.      *                     4.5[Level]2 - 162.5[Level] + 2220 (at level 31+)"
  35.      *
  36.      * @param level the level
  37.      *
  38.      * @return the total experience calculated
  39.      */
  40.     public static int getExpFromLevel(int level) {
  41.         if (level > 30) {
  42.             return (int) (4.5 * level * level - 162.5 * level + 2220);
  43.         }
  44.         if (level > 15) {
  45.             return (int) (2.5 * level * level - 40.5 * level + 360);
  46.         }
  47.         return level * level + 6 * level;
  48.     }
  49.    
  50.     /**
  51.      * Calculates level based on total experience.
  52.      *
  53.      * @param exp the total experience
  54.      *
  55.      * @return the level calculated
  56.      */
  57.     public static double getLevelFromExp(long exp) {
  58.         if (exp > 1395) {
  59.             return (Math.sqrt(72 * exp - 54215) + 325) / 18;
  60.         }
  61.         if (exp > 315) {
  62.             return Math.sqrt(40 * exp - 7839) / 10 + 8.1;
  63.         }
  64.         if (exp > 0) {
  65.             return Math.sqrt(exp + 9) - 3;
  66.         }
  67.         return 0;
  68.     }
  69.    
  70.     /**
  71.      * @see http://minecraft.gamepedia.com/Experience#Leveling_up
  72.      *
  73.      * "The formulas for figuring out how many experience orbs you need to get to the next level are as follows:
  74.      *  Experience Required = 2[Current Level] + 7 (at levels 0-15)
  75.      *                        5[Current Level] - 38 (at levels 16-30)
  76.      *                        9[Current Level] - 158 (at level 31+)"
  77.      */
  78.     private static int getExpToNext(int level) {
  79.         if (level > 30) {
  80.             return 9 * level - 158;
  81.         }
  82.         if (level > 15) {
  83.             return 5 * level - 38;
  84.         }
  85.         return 2 * level + 7;
  86.     }
  87.    
  88.     /**
  89.      * Change a Player's exp.
  90.      * <p>
  91.      * This method should be used in place of {@link Player#giveExp(int)}, which does not properly
  92.      * account for different levels requiring different amounts of experience.
  93.      *
  94.      * @param player the Player affected
  95.      * @param exp the amount of experience to add or remove
  96.      */
  97.     public static void changeExp(Player player, int exp) {
  98.         exp += getExp(player);
  99.        
  100.         if (exp < 0) {
  101.             exp = 0;
  102.         }
  103.        
  104.         double levelAndExp = getLevelFromExp(exp);
  105.        
  106.         int level = (int) levelAndExp;
  107.         player.setLevel(level);
  108.         player.setExp((float) (levelAndExp - level));
  109.     }
  110.    
  111.     public static int getExpToNext(Player player) {
  112.         return getExpFromLevel(player.getLevel() + 1) - getExp(player);
  113.     }
  114.    
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement