Adding enchants to the worth, removing EXP (TODO later)

This commit is contained in:
Molzonas 2025-08-22 00:29:01 +02:00
parent 6cd20b565b
commit a3b0965c47
9 changed files with 106 additions and 22 deletions

View File

@ -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;

View File

@ -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,12 +100,18 @@ 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])) {
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;
}
}

View File

@ -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<String, Double> getEnchantConfigTable() {
Map<String, Double> enchantConfig = new HashMap<>();
Set<String> 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;
}
}

View File

@ -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)));
}
}

View File

@ -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;
}
}

View File

@ -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<ItemStack> 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<String, Double> tableEnchant = PropertiesEnum.getEnchantConfigTable();
Map<Enchantment, Integer> enchants = item.getEnchantments();
for (Map.Entry<Enchantment, Integer> e : enchants.entrySet()) {
String enchantKey = e.getKey().getKey().getKey().toUpperCase(Locale.ROOT);
total += tableEnchant.getOrDefault(enchantKey, defaultRate) * e.getValue();
}
return total;
}
}

View File

@ -8,17 +8,13 @@ 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

View File

@ -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.

View File

@ -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.