diff --git a/pom.xml b/pom.xml index 652ad56..84602e7 100644 --- a/pom.xml +++ b/pom.xml @@ -102,14 +102,36 @@ net.kyori adventure-platform-bukkit - 4.0.1 + 4.1.1 compile + true + + + checker-qual + org.checkerframework + + + org.jetbrains + annotations + + net.kyori adventure-text-minimessage - 4.2.0-SNAPSHOT + 4.11.0 compile + true + + + checker-qual + org.checkerframework + + + org.jetbrains + annotations + + com.google.code.gson diff --git a/src/main/java/com/drtshock/playervaults/PlayerVaults.java b/src/main/java/com/drtshock/playervaults/PlayerVaults.java index c26cb6f..c7f247c 100644 --- a/src/main/java/com/drtshock/playervaults/PlayerVaults.java +++ b/src/main/java/com/drtshock/playervaults/PlayerVaults.java @@ -56,9 +56,11 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Field; import java.nio.file.Files; +import java.nio.file.Path; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -70,6 +72,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Supplier; import java.util.logging.Level; import java.util.regex.Pattern; +import java.util.stream.Collectors; public class PlayerVaults extends JavaPlugin { public static boolean DEBUG; @@ -358,6 +361,11 @@ public class PlayerVaults extends JavaPlugin { } try { + Path langPath = this.getDataFolder().toPath().resolve("lang.conf"); + List lines = Files.readAllLines(langPath); + List updatedLines = new ArrayList<>(); + lines.forEach(line -> updatedLines.add(line.replaceAll("\\{(vault|player|price|count|item)}", "<$1>"))); + Files.write(langPath, updatedLines.stream().collect(Collectors.joining("\n")).getBytes()); Loader.loadAndSave("lang", this.translation); } catch (IOException | IllegalAccessException e) { this.getLogger().log(Level.SEVERE, "Could not load lang.", e); diff --git a/src/main/java/com/drtshock/playervaults/commands/HelpMeCommand.java b/src/main/java/com/drtshock/playervaults/commands/HelpMeCommand.java index b221d41..d96678b 100644 --- a/src/main/java/com/drtshock/playervaults/commands/HelpMeCommand.java +++ b/src/main/java/com/drtshock/playervaults/commands/HelpMeCommand.java @@ -65,7 +65,7 @@ public class HelpMeCommand implements CommandExecutor { if (args.length >= 1 && args[0].equalsIgnoreCase("mini")) { Audience audience = PlayerVaults.getInstance().getPlatform().sender(sender); for (String string : mainInfo.toString().split("\n")) { - audience.sendMessage(MiniMessage.miniMessage().parse((sender instanceof Player ? "" : "") + string)); + audience.sendMessage(MiniMessage.miniMessage().deserialize((sender instanceof Player ? "" : "") + string)); } return true; } @@ -115,9 +115,9 @@ public class HelpMeCommand implements CommandExecutor { String delKey = result.getPaste().get().getDeletionKey().orElse("No deletion key"); String url = "https://paste.gg/anonymous/" + result.getPaste().get().getId(); audience.sendMessage(Component.text("URL generated: ").append(Component.text().clickEvent(ClickEvent.openUrl(url)).content(url))); - audience.sendMessage(MiniMessage.miniMessage().parse((sender instanceof Player ? "" : "") + "Deletion key: " + delKey)); + audience.sendMessage(MiniMessage.miniMessage().deserialize((sender instanceof Player ? "" : "") + "Deletion key: " + delKey)); } else { - audience.sendMessage(MiniMessage.miniMessage().parse("Failed to generate output. See console for details.")); + audience.sendMessage(MiniMessage.miniMessage().deserialize("Failed to generate output. See console for details.")); PlayerVaults.getInstance().getLogger().warning("Received: " + result.getMessage()); } } @@ -127,7 +127,7 @@ public class HelpMeCommand implements CommandExecutor { new BukkitRunnable() { @Override public void run() { - PlayerVaults.getInstance().getPlatform().sender(sender).sendMessage(MiniMessage.miniMessage().parse("Failed to generate output. See console for details.")); + PlayerVaults.getInstance().getPlatform().sender(sender).sendMessage(MiniMessage.miniMessage().deserialize("Failed to generate output. See console for details.")); } }.runTask(PlayerVaults.getInstance()); } diff --git a/src/main/java/com/drtshock/playervaults/config/file/Translation.java b/src/main/java/com/drtshock/playervaults/config/file/Translation.java index 2667137..34b6736 100644 --- a/src/main/java/com/drtshock/playervaults/config/file/Translation.java +++ b/src/main/java/com/drtshock/playervaults/config/file/Translation.java @@ -6,7 +6,12 @@ import com.google.common.collect.ImmutableMap; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.platform.bukkit.BukkitComponentSerializer; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.command.CommandSender; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -17,19 +22,12 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.util.stream.Collectors; @SuppressWarnings("FieldMayBeFinal") public class Translation { public static class TL extends ArrayList { private static transient PlayerVaults plugin; - private static transient final Pattern REPLACEMENT_PATTERN = Pattern.compile("(?:\\{([a-zA-Z0-9\\-_]+)(?:(?::)([a-zA-Z0-9_\\-|]+))?})"); - private static transient final Pattern TAG_PATTERN = Pattern.compile("(?:<(/?)([a-zA-Z\\-_]+)>)"); - private static transient final String SKIP_LINE_IF_MISSING = "s"; - private static transient final String BLANK_IF_MISSING = "b"; - private static transient final String PRE_FORMATTED = "p"; private static @NonNull TL of(@NonNull String... strings) { TL list = new TL(); @@ -44,6 +42,7 @@ public class Translation { } public class Builder { + private transient String randomNum = "475087174643246031314442067831418947468567422217%%__USER__%%0876702565715325383665"; private transient ImmutableMap.Builder map; private transient TL title; @@ -94,67 +93,24 @@ public class Translation { private void send(@NonNull Audience audience, @NonNull Map map, @Nullable TL title) { this.forEach(line -> { - Component component = this.getComponent(line, map, title); - if (component != null) { - audience.sendMessage(component); + if (line == null || line.isEmpty()) { + return; } + audience.sendMessage(this.getComponent(line, map, title)); }); } - private @Nullable Component getComponent(@NonNull String line, @NonNull Map map, @Nullable TL title) { + private @NonNull Component getComponent(@NonNull String line, @NonNull Map map, @Nullable TL title) { if (title != null && !title.isEmpty()) { line = title.get(0) + line; } - StringBuffer builder = null; - String found; - String foundDetails; - String repl; - String[] features; - Matcher replMatcher = TL.REPLACEMENT_PATTERN.matcher(line); - while (replMatcher.find()) { - if (builder == null) { - builder = new StringBuffer(); - } - found = replMatcher.group(1); - foundDetails = replMatcher.group(2); - features = foundDetails == null ? null : foundDetails.split("\\|"); - repl = map.get(found); - if (repl == null) { - if (this.arrContains(features, TL.SKIP_LINE_IF_MISSING)) { - return null; - } - if (this.arrContains(features, TL.BLANK_IF_MISSING)) { - replMatcher.appendReplacement(builder, ""); - } - } else { - if (this.arrContains(features, TL.PRE_FORMATTED)) { - repl = MiniMessage.miniMessage().escapeTokens(repl).replace("\\", "\\\\"); - } - replMatcher.appendReplacement(builder, repl); - } - } - if (builder != null) { - replMatcher.appendTail(builder); - line = builder.toString(); - builder = null; - } - - Matcher tagMatcher = TL.TAG_PATTERN.matcher(line); - while (tagMatcher.find()) { - if (builder == null) { - builder = new StringBuffer(); - } - found = tagMatcher.group(2); - repl = TL.plugin.getTL().colorMappings().get(found); - if (repl != null) { - tagMatcher.appendReplacement(builder, '<' + tagMatcher.group(1) + repl + '>'); - } - } - if (builder != null) { - tagMatcher.appendTail(builder); - line = builder.toString(); - } - return MiniMessage.miniMessage().parse(line); + TagResolver.Builder tagResolverBuilder = TagResolver.builder(); + TL.plugin.getTL().colorMappings().forEach((k, v) -> { + TextColor color = v.startsWith("#") ? TextColor.fromHexString(v) : NamedTextColor.NAMES.value(v); + tagResolverBuilder.tag(k, Tag.styling(color == null ? NamedTextColor.WHITE : color)); + }); + map.forEach((k, v) -> tagResolverBuilder.resolver(Placeholder.unparsed(k, v))); + return MiniMessage.miniMessage().deserialize(line, tagResolverBuilder.build()); } public @NonNull String getLegacy() { @@ -191,33 +147,33 @@ public class Translation { } private static class Translations { - private TL openVault = TL.of("Opening vault {vault}"); - private TL openOtherVault = TL.of("Opening vault {vault} of {player}"); + private TL openVault = TL.of("Opening vault "); + private TL openOtherVault = TL.of("Opening vault of "); private TL invalidArgs = TL.of("Invalid args!"); - private TL deleteVault = TL.of("Deleted vault {vault}"); - private TL deleteOtherVault = TL.of("Deleted vault {vault} of {player}"); - private TL deleteOtherVaultAll = TL.of("Deleted all vaults belonging to {player}"); + private TL deleteVault = TL.of("Deleted vault "); + private TL deleteOtherVault = TL.of("Deleted vault of "); + private TL deleteOtherVaultAll = TL.of("Deleted all vaults belonging to "); private TL playerOnly = TL.of("Sorry but that can only be run by a player!"); private TL mustBeNumber = TL.of("You need to specify a valid number."); private TL noPerms = TL.of("You don't have permission for that!"); private TL insufficientFunds = TL.of("You don't have enough money for that!"); - private TL refundAmount = TL.of("You were refunded {price} for deleting that vault."); - private TL costToCreate = TL.of("You were charged {price} for creating a vault."); - private TL costToOpen = TL.of("You were charged {price} for opening that vault."); + private TL refundAmount = TL.of("You were refunded for deleting that vault."); + private TL costToCreate = TL.of("You were charged for creating a vault."); + private TL costToOpen = TL.of("You were charged for opening that vault."); private TL vaultDoesNotExist = TL.of("That vault does not exist!"); private TL clickASign = TL.of("Now click a sign!"); private TL notASign = TL.of("You must click a sign!"); private TL setSign = TL.of("You have successfully set a PlayerVault access sign!"); - private TL existingVaults = TL.of("{player} has vaults: {vault}"); - private TL vaultTitle = TL.of("Vault #{vault}"); - private TL openWithSign = TL.of("Opening vault {vault} of {player}"); - private TL noOwnerFound = TL.of("Cannot find vault owner: {player}"); + private TL existingVaults = TL.of(" has vaults: "); + private TL vaultTitle = TL.of("Vault #"); + private TL openWithSign = TL.of("Opening vault of "); + private TL noOwnerFound = TL.of("Cannot find vault owner: "); private TL convertPluginNotFound = TL.of("No converter found for that plugin."); - private TL convertComplete = TL.of("Converted {count} players to PlayerVaults."); + private TL convertComplete = TL.of("Converted players to PlayerVaults."); private TL convertBackground = TL.of("Conversion has been forked to the background. See console for updates."); private TL locked = TL.of("Vaults are currently locked while conversion occurs. Please try again in a moment!"); private TL help = TL.of("/pv "); - private TL blockedItem = TL.of("{item} is blocked from vaults."); + private TL blockedItem = TL.of(" is blocked from vaults."); private TL signsDisabled = TL.of("Vault signs are currently disabled."); private TL blockedBadItem = TL.of("This item is not allowed in a vault."); } diff --git a/src/main/java/com/drtshock/playervaults/listeners/Listeners.java b/src/main/java/com/drtshock/playervaults/listeners/Listeners.java index 77e6db9..61b6ccb 100644 --- a/src/main/java/com/drtshock/playervaults/listeners/Listeners.java +++ b/src/main/java/com/drtshock/playervaults/listeners/Listeners.java @@ -127,6 +127,9 @@ public class Listeners implements Listener { if (event.getHotbarButton() > -1 && event.getWhoClicked().getInventory().getItem(event.getHotbarButton()) != null) { items[1] = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); } + if (event.getClick().name().equals("SWAP_OFFHAND")) { + items[1] = event.getWhoClicked().getInventory().getItemInOffHand(); + } for (ItemStack item : items) { if (item == null) {