diff --git a/src/main/java/org/black_ixx/bossshop/core/prices/BSPriceTypeExp.java b/src/main/java/org/black_ixx/bossshop/core/prices/BSPriceTypeExp.java index 3d8bdcc..b1c65f9 100644 --- a/src/main/java/org/black_ixx/bossshop/core/prices/BSPriceTypeExp.java +++ b/src/main/java/org/black_ixx/bossshop/core/prices/BSPriceTypeExp.java @@ -1,6 +1,5 @@ package org.black_ixx.bossshop.core.prices; - import org.black_ixx.bossshop.core.BSBuy; import org.black_ixx.bossshop.managers.ClassManager; import org.black_ixx.bossshop.managers.misc.InputReader; @@ -30,20 +29,32 @@ public void enableType() { @Override public boolean hasPrice(Player p, BSBuy buy, Object price, ClickType clickType, int multiplier, boolean messageOnFailure) { - int exp = (int) ClassManager.manager.getMultiplierHandler().calculatePriceWithMultiplier(p, buy, clickType, (Integer) price) * multiplier; - if ((p.getLevel() < (Integer) exp)) { - if (messageOnFailure) { - ClassManager.manager.getMessageHandler().sendMessage("NotEnough.Exp", p); - } - return false; - } - return true; + int exp = (int) ClassManager.manager.getMultiplierHandler().calculatePriceWithMultiplier(p, buy, clickType, (Integer) price) * multiplier; + if (ClassManager.manager.getSettings().getExpUseLevel()) { + if ((p.getLevel() < (Integer) exp)) { + if (messageOnFailure) { + ClassManager.manager.getMessageHandler().sendMessage("NotEnough.Exp", p); + } + return false; + } + } + else if (getTotalExperience(p) < (Integer) exp) { + if (messageOnFailure) { + ClassManager.manager.getMessageHandler().sendMessage("NotEnough.Exp", p); + } + return false; + } + return true; } @Override public String takePrice(Player p, BSBuy buy, Object price, ClickType clickType, int multiplier) { - int exp = (int) ClassManager.manager.getMultiplierHandler().calculatePriceWithMultiplier(p, buy, clickType, (Integer) price) * multiplier; - p.setLevel(p.getLevel() - exp); + int exp = (int) ClassManager.manager.getMultiplierHandler().calculatePriceWithMultiplier(p, buy, clickType, (Integer) price) * multiplier; + if (ClassManager.manager.getSettings().getExpUseLevel()) { + p.setLevel(p.getLevel() - exp); + } else { + p.giveExp(-exp); + } return getDisplayBalance(p, buy, price, clickType); } @@ -76,5 +87,31 @@ public boolean isIntegerValue() { return true; } + private int getExperienceAtLevel(Player player) { + return this.getExperienceAtLevel(player.getLevel()); + } + + private int getExperienceAtLevel(int level) { + if (level <= 15) { + return (level << 1) + 7; + } + if (level >= 16 && level <= 30) { + return (level * 5) - 38; + } + return (level * 9) - 158; + } + + private int getTotalExperience(Player player) { + int experience = Math.round(this.getExperienceAtLevel(player) * player.getExp()); + int currentLevel = player.getLevel(); + while (currentLevel > 0) { + currentLevel--; + experience += this.getExperienceAtLevel(currentLevel); + } + if (experience < 0) { + experience = Integer.MAX_VALUE; + } + return experience; + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1a1fd3f..66340ba 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -156,7 +156,7 @@ NumberDisplay: SellAllPlaceholderShowFinalReward: false # # -# ExpUseLevels: If enabled rewards of type 'Exp' stand for "Exp level". Set this to false if you want to sell plain exp. This affects rewards only. +# ExpUseLevels: If enabled rewards of type 'Exp' stand for "Exp level". Set this to false if you want to use plain exp. ExpUseLevels: true # # @@ -247,4 +247,4 @@ Sound: ChangePage: 'UI_BUTTON_CLICK:0.2:1' ChangeShop: 'BLOCK_CHEST_OPEN:0.2:1' Open: 'ENTITY_ELDER_GUARDIAN_CURSE:1:1.8' - Close: '' \ No newline at end of file + Close: ''