diff --git a/src/main/java/fr/molzonas/painfulloss/PainfulLoss.java b/src/main/java/fr/molzonas/painfulloss/PainfulLoss.java index 5c9cc2f..b459f50 100644 --- a/src/main/java/fr/molzonas/painfulloss/PainfulLoss.java +++ b/src/main/java/fr/molzonas/painfulloss/PainfulLoss.java @@ -47,7 +47,7 @@ public final class PainfulLoss extends JavaPlugin { } private void langInit() { - Locale locale = Locale.forLanguageTag(PropertiesEnum.LOCALE.getValue()); + Locale locale = Locale.forLanguageTag(PropertiesEnum.LOCALE.getString()); Message.init(locale); } @@ -88,7 +88,7 @@ public final class PainfulLoss extends JavaPlugin { } // Selection - String provider = PropertiesEnum.PRICE_PROVIDER.getValue(); + String provider = PropertiesEnum.PRICE_PROVIDER.getString(); if (provider != null) { switch (provider.toLowerCase()) { case "ultimateshop": priceProvider = ultimateShopProvider.orElse(countProvider); break; diff --git a/src/main/java/fr/molzonas/painfulloss/commands/PainfulLossCommand.java b/src/main/java/fr/molzonas/painfulloss/commands/PainfulLossCommand.java index 4e5ea6f..ca0d482 100644 --- a/src/main/java/fr/molzonas/painfulloss/commands/PainfulLossCommand.java +++ b/src/main/java/fr/molzonas/painfulloss/commands/PainfulLossCommand.java @@ -1,6 +1,7 @@ package fr.molzonas.painfulloss.commands; import fr.molzonas.painfulloss.PainfulLoss; +import fr.molzonas.painfulloss.enums.PropertiesEnum; import fr.molzonas.painfulloss.utils.Message; import fr.molzonas.painfulloss.utils.PriceCalculator; import org.bukkit.ChatColor; @@ -75,14 +76,16 @@ public class PainfulLossCommand implements CommandExecutor, TabCompleter { private boolean commandWorth(CommandSender commandSender, String[] args) { if (args.length == 1 && commandSender instanceof Player p && commandSender.hasPermission("painfulloss.worth")) { - commandSender.sendMessage(Message.of("command.worth", PriceCalculator.estimate(p))); + commandSender.sendMessage(Message.of("command.worth", PriceCalculator.estimate(p) + + (PropertiesEnum.ENCHANT_ENABLED.getBoolean() ? PriceCalculator.enchantEstimate(p) : 0))); } else if (args.length == 2 && commandSender.hasPermission("painfulloss.worth.other")) { Player p = PainfulLoss.getInstance().getServer().getPlayer(args[1]); if (p == null) { commandSender.sendMessage(Message.of("command.worth.unknownplayer", args[1])); return true; } - commandSender.sendMessage(Message.of("command.worth.other", PriceCalculator.estimate(p))); + commandSender.sendMessage(Message.of("command.worth.other", p.getName(), PriceCalculator.estimate(p) + + (PropertiesEnum.ENCHANT_ENABLED.getBoolean() ? PriceCalculator.enchantEstimate(p) : 0))); } else { return commandNotAutorised(commandSender); } @@ -97,11 +100,17 @@ public class PainfulLossCommand implements CommandExecutor, TabCompleter { if (args.length == 1) { completions.add("test"); completions.add("help"); + completions.add("worth"); if (commandSender.hasPermission("painfulloss.admin")) completions.add("reload"); } - if (args.length == 2 && "test".equalsIgnoreCase(args[0])) { - completions.add("fr-FR"); - completions.add("en-US"); + if (args.length == 2) { + if ("test".equalsIgnoreCase(args[0])) { + completions.add("fr-FR"); + completions.add("en-US"); + } + if ("worth".equalsIgnoreCase(args[0]) && commandSender.hasPermission("painfulloss.worth.other")) { + completions = PainfulLoss.getInstance().getServer().getOnlinePlayers().stream().map(Player::getName).toList(); + } } return completions; } diff --git a/src/main/java/fr/molzonas/painfulloss/enums/PropertiesEnum.java b/src/main/java/fr/molzonas/painfulloss/enums/PropertiesEnum.java index 95a1211..17a34ef 100644 --- a/src/main/java/fr/molzonas/painfulloss/enums/PropertiesEnum.java +++ b/src/main/java/fr/molzonas/painfulloss/enums/PropertiesEnum.java @@ -3,10 +3,16 @@ package fr.molzonas.painfulloss.enums; import fr.molzonas.painfulloss.PainfulLoss; import lombok.Getter; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + public enum PropertiesEnum { LOCALE("locale", PainfulLoss.DEFAULT_LOCALE_TAG), DEBUG("debug", "false"), - PRICE_PROVIDER("priceProvider") + PRICE_PROVIDER("priceProvider"), + ENCHANT_ENABLED("estimation.enchant.enabled"), + ENCHANT_DEFAULT_PER_LEVEL("estimation.enchant.default_per_level") ; @Getter private final String path; @@ -21,8 +27,25 @@ public enum PropertiesEnum { this.fallback = fallback; } - public String getValue() { + public String getString() { String value = PainfulLoss.getInstance().getConfig().getString(this.getPath()); return value == null ? fallback : value; } + + public boolean getBoolean() { + return PainfulLoss.getInstance().getConfig().getBoolean(this.getPath()); + } + + public Double getDouble() { + return PainfulLoss.getInstance().getConfig().getDouble(this.getPath()); + } + + public static Map getEnchantConfigTable() { + Map enchantConfig = new HashMap<>(); + Set keys = PainfulLoss.getInstance().getConfig().getConfigurationSection("estimation.enchant.table").getKeys(false); + for (String key : keys) { + enchantConfig.put(key, PainfulLoss.getInstance().getConfig().getDouble("estimation.enchant.table." + key, 0d)); + } + return enchantConfig; + } } diff --git a/src/main/java/fr/molzonas/painfulloss/listeners/DeathListener.java b/src/main/java/fr/molzonas/painfulloss/listeners/DeathListener.java index 8c7ad0b..dc39fcf 100644 --- a/src/main/java/fr/molzonas/painfulloss/listeners/DeathListener.java +++ b/src/main/java/fr/molzonas/painfulloss/listeners/DeathListener.java @@ -1,6 +1,7 @@ package fr.molzonas.painfulloss.listeners; import fr.molzonas.painfulloss.PainfulLoss; +import fr.molzonas.painfulloss.enums.PropertiesEnum; import fr.molzonas.painfulloss.utils.Message; import fr.molzonas.painfulloss.utils.PriceCalculator; import org.bukkit.GameRule; @@ -32,10 +33,12 @@ public class DeathListener implements Listener { double total = PriceCalculator.estimate(lostItems); + if (PropertiesEnum.ENCHANT_ENABLED.getBoolean()) total += PriceCalculator.enchantEstimate(lostItems); + if (PainfulLoss.getPriceProvider().isCountBased()) { player.sendMessage(Message.of("death.summary.count", player.getName(), total)); } else { - player.sendMessage(Message.of("death.summary.value", player.getName(), numberFormat(total))); + PainfulLoss.getInstance().getServer().broadcastMessage(Message.of("death.summary.value", player.getName(), numberFormat(total))); } } diff --git a/src/main/java/fr/molzonas/painfulloss/provider/EssentialsPriceProvider.java b/src/main/java/fr/molzonas/painfulloss/provider/EssentialsPriceProvider.java index 0c3decf..98fb194 100644 --- a/src/main/java/fr/molzonas/painfulloss/provider/EssentialsPriceProvider.java +++ b/src/main/java/fr/molzonas/painfulloss/provider/EssentialsPriceProvider.java @@ -10,9 +10,11 @@ import java.util.Optional; public class EssentialsPriceProvider implements PriceProvider { private final IEssentials plugin; private final Worth worth; + private boolean ready = false; public EssentialsPriceProvider(IEssentials plugin) { this.plugin = plugin; this.worth = plugin.getWorth(); + this.ready = true; } @Override @@ -33,4 +35,9 @@ public class EssentialsPriceProvider implements PriceProvider { return Optional.empty(); } } + + @Override + public boolean isReady() { + return ready; + } } diff --git a/src/main/java/fr/molzonas/painfulloss/utils/PriceCalculator.java b/src/main/java/fr/molzonas/painfulloss/utils/PriceCalculator.java index 74deeac..5e0b30a 100644 --- a/src/main/java/fr/molzonas/painfulloss/utils/PriceCalculator.java +++ b/src/main/java/fr/molzonas/painfulloss/utils/PriceCalculator.java @@ -1,10 +1,15 @@ package fr.molzonas.painfulloss.utils; import fr.molzonas.painfulloss.PainfulLoss; +import fr.molzonas.painfulloss.enums.PropertiesEnum; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.List; +import java.util.Locale; +import java.util.Map; public class PriceCalculator { private PriceCalculator() {} @@ -28,4 +33,35 @@ public class PriceCalculator { public static Double estimate(ItemStack item) { return PainfulLoss.getPriceProvider().getPrice(item).orElse(0d); } + + public static Double enchantEstimate(Player player) { + return enchantEstimate(player.getInventory().getContents()); + } + + public static Double enchantEstimate(ItemStack[] items) { + double rs = 0d; + for (ItemStack item : items) { + rs += enchantEstimate(item); + } + return rs; + } + + public static Double enchantEstimate(List items) { + return items.stream().mapToDouble(PriceCalculator::enchantEstimate).sum(); + } + + public static Double enchantEstimate(ItemStack item) { + if (item == null + || item.getType() == Material.AIR + || item.getEnchantments().isEmpty()) return 0d; + double total = 0d; + double defaultRate = PropertiesEnum.ENCHANT_DEFAULT_PER_LEVEL.getDouble(); + Map tableEnchant = PropertiesEnum.getEnchantConfigTable(); + Map enchants = item.getEnchantments(); + for (Map.Entry e : enchants.entrySet()) { + String enchantKey = e.getKey().getKey().getKey().toUpperCase(Locale.ROOT); + total += tableEnchant.getOrDefault(enchantKey, defaultRate) * e.getValue(); + } + return total; + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 80afabd..1bad89a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -8,20 +8,16 @@ debug: false # Keep it empty will take the first available in order between UltimateShop, Essentials and Count. priceProvider: -# How estimations works, estimation: - xp: - enabled: true - price_per_point: 0.5 - show_in_message: true - show_in_message_with_level: true - + # Is enchants on items used in worth calculation ? enchant: enabled: true - default_per_level: 0 + default_per_level: 0 # If not in the table below, the base price per level for enchants + # Evaluate every enchant worth in money per level + # Use https://minecraft.fandom.com/wiki/Enchanting for IDs (identifier, but in all cap) table: SHARPNESS: 100 EFFICIENCY: 100 UNBREAKING: 50 FORTUNE: 300 - MENDING: 1000 \ No newline at end of file + MENDING: 1000 diff --git a/src/main/resources/lang/messages_en.properties b/src/main/resources/lang/messages_en.properties index 56de8f4..cfab97a 100644 --- a/src/main/resources/lang/messages_en.properties +++ b/src/main/resources/lang/messages_en.properties @@ -1,8 +1,13 @@ -death.summary.value=&c{0} lost the equivalent of &e{1}$&c. +# On death death.summary.count=&c{0} lost &e{1}&c item(s). -death.topitem=&7Most valuable: &6{0} &7(&e{1}&7) +death.summary.value=&c{0} lost the equivalent of &e{1}$&c. +death.topitem=&cMost valuable: &6{0} &c(&6{1}$&c) + +# On command command.worth=&6Your full inventory is worth {0}$. command.worth.other=&6{0} full inventory is worth {1}$. command.worth.unknownplayer=&cThe requested player ({0}) has not been found. + +# Plugin core & misc plugin.reload=&aPainfulLoss has successfully reloaded. plugin.unknown=&4Unknown command. Please use &c/painfullost help &4to get some help. \ No newline at end of file diff --git a/src/main/resources/lang/messages_fr.properties b/src/main/resources/lang/messages_fr.properties index 5b08dbc..ec1ca36 100644 --- a/src/main/resources/lang/messages_fr.properties +++ b/src/main/resources/lang/messages_fr.properties @@ -1,8 +1,13 @@ -death.summary.value=&c{0} a perdu l'équivalent de &e{1}$&c. +# On death death.summary.count=&c{0} a perdu &e{1}&c item(s). +death.summary.value=&c{0} a perdu l'équivalent de &e{1}$&c. death.topitem=&7Objet le plus cher : &6{0} &7(&e{1}&7) + +# On command command.worth=&6Votre inventaire complet vaut {0}$. command.worth.other=&6L''inventaire complet de {0} vaut {1}$. command.worth.unknownplayer=&cLe joueur demandé ({0}) n''a pas été trouvé. + +# Plugin core & misc plugin.reload=&aPainfulLoss a été rechargé avec succès. plugin.unknown=&4Commande inconnue. Merci d'utiliser &c/painfulloss help &4pour obtenir de l'aide. \ No newline at end of file