diff --git a/pom.xml b/pom.xml
index 0a817a3..285c2a9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,6 +13,28 @@
16
+
+
+
+
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
papermc
@@ -29,10 +51,16 @@
+
+ org.apache.commons
+ commons-math3
+ 3.2
+ compile
+
io.papermc.paper
paper-api
- 1.17-R0.1-SNAPSHOT
+ 1.18-R0.1-SNAPSHOT
provided
diff --git a/src/main/java/com/alttd/GUI/windows/BuyGUI.java b/src/main/java/com/alttd/GUI/windows/BuyGUI.java
index c028286..3ddc4df 100644
--- a/src/main/java/com/alttd/GUI/windows/BuyGUI.java
+++ b/src/main/java/com/alttd/GUI/windows/BuyGUI.java
@@ -3,6 +3,7 @@ package com.alttd.GUI.windows;
import com.alttd.GUI.GUIMerchant;
import com.alttd.VillagerUI;
import com.alttd.config.Config;
+import com.alttd.config.WorthConfig;
import com.alttd.events.SpawnShopEvent;
import com.alttd.objects.EconUser;
import com.alttd.objects.Price;
@@ -39,7 +40,10 @@ public class BuyGUI extends GUIMerchant {
private void buy(VillagerType villagerType, Player player, Material material, int amount, Price price) {
Economy econ = VillagerUI.getInstance().getEconomy();
double balance = econ.getBalance(player);
- double cost = price.getPrice(amount);
+ int trans_pts = (int) (Math.floor(price.getPrice(amount)/ WorthConfig.POINT_MOD) * amount);
+ EconUser econUser = EconUser.users.get(player.getUniqueId());
+ int oldPoints = econUser.getPointsMap().get(villagerType.getName());
+ double cost = price.calculatePriceThing(oldPoints, trans_pts);
if (balance < cost) {
player.sendMessage(MiniMessage.get().parse(Config.NOT_ENOUGH_MONEY,
@@ -47,11 +51,9 @@ public class BuyGUI extends GUIMerchant {
Template.of("price", String.valueOf(price))));
return;
}
- EconUser econUser = EconUser.users.get(player.getUniqueId());
- int oldPoints = econUser.getPointsMap().get(villagerType.getName());
econ.withdrawPlayer(player, cost);
- econUser.addPoints(villagerType.getName(), price.getPoints());
+ econUser.addPoints(villagerType.getName(), trans_pts);
player.sendMessage(MiniMessage.get().parse(Config.PURCHASED_ITEM,
Template.of("amount", String.valueOf(amount)),
Template.of("item", material.toString()),
diff --git a/src/main/java/com/alttd/GUI/windows/SellGUI.java b/src/main/java/com/alttd/GUI/windows/SellGUI.java
index fd78512..714756e 100644
--- a/src/main/java/com/alttd/GUI/windows/SellGUI.java
+++ b/src/main/java/com/alttd/GUI/windows/SellGUI.java
@@ -3,6 +3,7 @@ package com.alttd.GUI.windows;
import com.alttd.GUI.GUIMerchant;
import com.alttd.VillagerUI;
import com.alttd.config.Config;
+import com.alttd.config.WorthConfig;
import com.alttd.events.SpawnShopEvent;
import com.alttd.objects.EconUser;
import com.alttd.objects.Price;
@@ -39,9 +40,10 @@ public class SellGUI extends GUIMerchant {
private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price) {
Economy econ = VillagerUI.getInstance().getEconomy();
- double cost = price.getPrice(amount);
EconUser econUser = EconUser.users.get(player.getUniqueId());
int oldPoints = econUser.getPointsMap().get(villagerType.getName());
+ int trans_pts = (int) (Math.floor(price.getPrice(amount)/ WorthConfig.POINT_MOD) * amount);
+ double cost = price.calculatePriceThing(oldPoints, trans_pts);
econ.depositPlayer(player, cost);
econUser.addPoints(villagerType.getName(), -price.getPoints());
diff --git a/src/main/java/com/alttd/config/VillagerConfig.java b/src/main/java/com/alttd/config/VillagerConfig.java
index c0422d3..91fee3e 100644
--- a/src/main/java/com/alttd/config/VillagerConfig.java
+++ b/src/main/java/com/alttd/config/VillagerConfig.java
@@ -1,12 +1,8 @@
package com.alttd.config;
-import com.alttd.VillagerUI;
import com.alttd.objects.LoadedVillagers;
import com.alttd.objects.VillagerType;
import com.alttd.util.Logger;
-import org.bukkit.configuration.ConfigurationSection;
-
-import java.util.Set;
import java.util.UUID;
public class VillagerConfig extends AbstractConfig {
diff --git a/src/main/java/com/alttd/config/WorthConfig.java b/src/main/java/com/alttd/config/WorthConfig.java
index c408c8c..0bcc48d 100644
--- a/src/main/java/com/alttd/config/WorthConfig.java
+++ b/src/main/java/com/alttd/config/WorthConfig.java
@@ -46,4 +46,9 @@ public class WorthConfig extends AbstractConfig {
prices.put(Material.getMaterial(key), new Price(Utilities.round(worth.getDouble(key), 2)));
}
}
+
+ public static int POINT_MOD = 4;
+ private static void loadOtherStuff() {
+ POINT_MOD = config.getInt("point-mod", POINT_MOD);
+ }
}
diff --git a/src/main/java/com/alttd/events/VillagerInteract.java b/src/main/java/com/alttd/events/VillagerInteract.java
index f7f971f..f96d9c8 100644
--- a/src/main/java/com/alttd/events/VillagerInteract.java
+++ b/src/main/java/com/alttd/events/VillagerInteract.java
@@ -5,6 +5,7 @@ import com.alttd.VillagerUI;
import com.alttd.config.Config;
import com.alttd.objects.LoadedVillagers;
import com.alttd.objects.VillagerType;
+import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -23,7 +24,7 @@ public class VillagerInteract implements Listener {
return;
if (!event.getPlayer().hasPermission(loadedVillager.getPermission())) {
- event.getPlayer().sendMessage(Config.NO_PERMISSION); //TODO more specific message?
+ event.getPlayer().sendMessage(MiniMessage.get().parse(Config.NO_PERMISSION)); //TODO more specific message?
return;
}
new BukkitRunnable() {
diff --git a/src/main/java/com/alttd/objects/Price.java b/src/main/java/com/alttd/objects/Price.java
index 751c87d..131b08f 100644
--- a/src/main/java/com/alttd/objects/Price.java
+++ b/src/main/java/com/alttd/objects/Price.java
@@ -3,11 +3,17 @@ package com.alttd.objects;
import com.alttd.config.Config;
import com.alttd.util.Logger;
import com.alttd.util.Utilities;
+import org.apache.commons.math3.analysis.function.StepFunction;
+import org.apache.commons.math3.analysis.integration.TrapezoidIntegrator;
public final class Price {
private final double price;
private final int points;
+ double x_mult[] = {0, 500, 2000, 4000};
+ double y_mult[] = {1.0, 1.5, 2.5, 5.0};
+ StepFunction multiplierModel = new StepFunction(x_mult, y_mult);
+
public Price(double price) {
this.price = price;
for (int key : Config.pointsRangeMap.keySet()) {
@@ -28,6 +34,12 @@ public final class Price {
return (Utilities.round(price * multiplier, 2));
}
+ public double calculatePriceThing(int oldPoints, int transPts) {
+ // Compute numerical integration to determine price
+ TrapezoidIntegrator trapez = new TrapezoidIntegrator();
+ return (price * trapez.integrate(10, multiplierModel, oldPoints, oldPoints + transPts));
+ }
+
public int getPoints() {
return (points);
}