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) {