From 99d8a5007efd9edc9a380274e11c58139604d35d Mon Sep 17 00:00:00 2001 From: stjn Date: Wed, 10 Nov 2021 16:58:47 +0100 Subject: [PATCH] Reworked points to be based on item price --- .../java/com/alttd/GUI/windows/BuyGUI.java | 8 ++- .../java/com/alttd/GUI/windows/SellGUI.java | 6 ++ src/main/java/com/alttd/config/Config.java | 67 +++++++++++++++++++ .../java/com/alttd/config/WorthConfig.java | 24 ++----- src/main/java/com/alttd/objects/Price.java | 20 +++++- 5 files changed, 104 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/alttd/GUI/windows/BuyGUI.java b/src/main/java/com/alttd/GUI/windows/BuyGUI.java index b9bf8ad..c3f2af8 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.events.SpawnShopEvent; import com.alttd.objects.EconUser; import com.alttd.objects.Price; import com.alttd.objects.VillagerType; @@ -10,12 +11,11 @@ import com.alttd.util.Utilities; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.Template; import net.milkbowl.vault.economy.Economy; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.entity.Villager; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; - public class BuyGUI extends GUIMerchant { private static final MiniMessage miniMessage = MiniMessage.get(); @@ -54,6 +54,10 @@ public class BuyGUI extends GUIMerchant { Template.of("amount", String.valueOf(amount)), Template.of("item", material.toString()), Template.of("price", String.valueOf(price)))); + + Bukkit.getServer().getPluginManager() + .callEvent(new SpawnShopEvent(player, amount, cost, material, + 0, 0, true)); } private ItemStack getPriceItem(double price) { diff --git a/src/main/java/com/alttd/GUI/windows/SellGUI.java b/src/main/java/com/alttd/GUI/windows/SellGUI.java index 2d64427..1a4d670 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.events.SpawnShopEvent; import com.alttd.objects.EconUser; import com.alttd.objects.Price; import com.alttd.objects.VillagerType; @@ -10,6 +11,7 @@ import com.alttd.util.Utilities; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.Template; import net.milkbowl.vault.economy.Economy; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -46,6 +48,10 @@ public class SellGUI extends GUIMerchant { Template.of("amount", String.valueOf(amount)), Template.of("item", material.toString()), Template.of("price", String.valueOf(price)))); + + Bukkit.getServer().getPluginManager() + .callEvent(new SpawnShopEvent(player, amount, cost, material, + 0, 0, false)); } private ItemStack getPriceItem(double price) { diff --git a/src/main/java/com/alttd/config/Config.java b/src/main/java/com/alttd/config/Config.java index bad644c..438fd44 100644 --- a/src/main/java/com/alttd/config/Config.java +++ b/src/main/java/com/alttd/config/Config.java @@ -3,6 +3,12 @@ package com.alttd.config; import com.alttd.VillagerUI; import com.alttd.objects.VillagerType; import com.alttd.util.Logger; +import com.google.common.collect.Range; +import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectSortedMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectSortedMaps; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; @@ -10,6 +16,8 @@ import org.bukkit.inventory.ItemStack; import java.io.File; import java.util.HashSet; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public final class Config extends AbstractConfig { @@ -114,6 +122,65 @@ public final class Config extends AbstractConfig { }); } + public static Int2ObjectAVLTreeMap> pointsRangeMap = new Int2ObjectAVLTreeMap<>(); + private static void loadPointRange() { + pointsRangeMap.clear(); + Pattern pattern = Pattern.compile("[1-9][0-9]{0,2}(.[0-9]{1,2})?-[1-9][0-9]{0,2}(.[0-9]{1,2})?"); + + ConfigurationSection configurationSection = config.getConfigurationSection("points"); + if (configurationSection == null) { + Logger.severe(""" + No point entries in config (see example). Please add them and restart the plugin. + points: + \t1: 0.5-1.5 + \t3: 1.5-2.25 + \t5: 2.25-0 #2.25 and higher"""); + VillagerUI.getInstance().getServer().getPluginManager().disablePlugin(VillagerUI.getInstance()); + return; + } + Set keys = configurationSection.getKeys(false); + for (String key : keys) { + int points = Integer.parseInt(key); + if (points == 0) { + Logger.warning("Invalid point entry % in config", key); + continue; + } + + String range = configurationSection.getString(key); + if (range == null) { + Logger.warning("Invalid point value for % in config", key); + continue; + } + Matcher matcher = pattern.matcher(range); + if (!matcher.matches()) { + Logger.warning("Invalid point value % for % in config " + + "should be double - double (0-2.05)", range, key); + continue; + } + String[] split = range.split("-"); + if (split.length != 2) { + Logger.severe(""" + The logic for the regex failed when loading points. + key:% + value:%""", key, range); + continue; + } + double d1 = Double.parseDouble(split[0]); + double d2 = Double.parseDouble(split[1]); + Range doubleRange; + if (d2 == 0 && d1 > d2) + doubleRange = Range.greaterThan(d1); + else if (d2 > d1) + doubleRange = Range.closed(d1, d2); + else { + Logger.warning("Invalid range d1:% to d2:%, can't be the same, d1 can't be bigger " + + "than d2 unless d2 is 0 (infinite)", String.valueOf(d1), String.valueOf(d2)); + continue; + } + pointsRangeMap.put(points, doubleRange); + } + } + private static HashSet loadProducts(ConfigurationSection productsSection) { HashSet products = new HashSet<>(); if (productsSection == null) diff --git a/src/main/java/com/alttd/config/WorthConfig.java b/src/main/java/com/alttd/config/WorthConfig.java index 22fd4dc..9241ff5 100644 --- a/src/main/java/com/alttd/config/WorthConfig.java +++ b/src/main/java/com/alttd/config/WorthConfig.java @@ -1,17 +1,13 @@ package com.alttd.config; -import com.alttd.VillagerUI; import com.alttd.objects.Price; import com.alttd.util.Logger; import com.alttd.util.Utilities; -import it.unimi.dsi.fastutil.objects.Object2DoubleMap; -import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import java.io.File; -import java.util.HashMap; import java.util.Set; public class WorthConfig extends AbstractConfig { @@ -32,22 +28,16 @@ public class WorthConfig extends AbstractConfig { } public static Object2ObjectOpenHashMap prices = new Object2ObjectOpenHashMap<>(); - - private static void loadWorth() { + private static void loadWorth() { //TODO test after removing points prices.clear(); ConfigurationSection worth = config.getConfigurationSection("worth"); - Set points = worth.getKeys(false); - for (String point : points) { - ConfigurationSection pointSection = worth.getConfigurationSection(point); - Set materials = worth.getConfigurationSection(point).getKeys(false); - for (String key : materials) { - Material material = Material.getMaterial(key); - if (material == null) { - Logger.warning("Invalid key in worth.yml: %.", key); - continue; - } - prices.put(Material.getMaterial(key), new Price(Utilities.round(pointSection.getDouble(key), 2), Integer.parseInt(point))); + Set materials = worth.getKeys(false); + for (String key : materials) { + if (key == null) { + Logger.warning("Invalid key in worth.yml: %.", key); + continue; } + prices.put(Material.getMaterial(key), new Price(Utilities.round(worth.getDouble(key), 2))); } } } diff --git a/src/main/java/com/alttd/objects/Price.java b/src/main/java/com/alttd/objects/Price.java index 2057329..550d0ab 100644 --- a/src/main/java/com/alttd/objects/Price.java +++ b/src/main/java/com/alttd/objects/Price.java @@ -1,10 +1,25 @@ package com.alttd.objects; +import com.alttd.config.Config; import com.alttd.util.Utilities; -public record Price(double price, int points) { +public final class Price { + private final double price; + private final int points; + + public Price(double price) { + this.price = price; + for (int key : Config.pointsRangeMap.keySet()) { + if (Config.pointsRangeMap.get(key).contains(price)) { + points = key; + return; + } + } + points = -1; //TODO check for if points is -1 + } + public static Price addPrice(Price one, Price two) { - return (new Price(Utilities.round(one.price() + two.price(), 2), one.points() + two.points())); + return (new Price(Utilities.round(one.getPrice(1) + two.getPrice(1), 2))); } public double getPrice(int multiplier) { @@ -14,4 +29,5 @@ public record Price(double price, int points) { public int getPoints() { return (points); } + }