Update adventure for 1.19

This commit is contained in:
mbax
2022-06-28 14:18:19 -04:00
parent 6a0d3e2545
commit e1bf9ddcbc
5 changed files with 70 additions and 81 deletions
+24 -2
View File
@@ -102,14 +102,36 @@
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId> <artifactId>adventure-platform-bukkit</artifactId>
<version>4.0.1</version> <version>4.1.1</version>
<scope>compile</scope> <scope>compile</scope>
<optional>true</optional>
<exclusions>
<exclusion>
<artifactId>checker-qual</artifactId>
<groupId>org.checkerframework</groupId>
</exclusion>
<exclusion>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId> <artifactId>adventure-text-minimessage</artifactId>
<version>4.2.0-SNAPSHOT</version> <version>4.11.0</version>
<scope>compile</scope> <scope>compile</scope>
<optional>true</optional>
<exclusions>
<exclusion>
<artifactId>checker-qual</artifactId>
<groupId>org.checkerframework</groupId>
</exclusion>
<exclusion>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
@@ -56,9 +56,11 @@ import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -70,6 +72,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class PlayerVaults extends JavaPlugin { public class PlayerVaults extends JavaPlugin {
public static boolean DEBUG; public static boolean DEBUG;
@@ -358,6 +361,11 @@ public class PlayerVaults extends JavaPlugin {
} }
try { try {
Path langPath = this.getDataFolder().toPath().resolve("lang.conf");
List<String> lines = Files.readAllLines(langPath);
List<String> 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); Loader.loadAndSave("lang", this.translation);
} catch (IOException | IllegalAccessException e) { } catch (IOException | IllegalAccessException e) {
this.getLogger().log(Level.SEVERE, "Could not load lang.", e); this.getLogger().log(Level.SEVERE, "Could not load lang.", e);
@@ -65,7 +65,7 @@ public class HelpMeCommand implements CommandExecutor {
if (args.length >= 1 && args[0].equalsIgnoreCase("mini")) { if (args.length >= 1 && args[0].equalsIgnoreCase("mini")) {
Audience audience = PlayerVaults.getInstance().getPlatform().sender(sender); Audience audience = PlayerVaults.getInstance().getPlatform().sender(sender);
for (String string : mainInfo.toString().split("\n")) { for (String string : mainInfo.toString().split("\n")) {
audience.sendMessage(MiniMessage.miniMessage().parse((sender instanceof Player ? "<rainbow>" : "<green>") + string)); audience.sendMessage(MiniMessage.miniMessage().deserialize((sender instanceof Player ? "<rainbow>" : "<green>") + string));
} }
return true; return true;
} }
@@ -115,9 +115,9 @@ public class HelpMeCommand implements CommandExecutor {
String delKey = result.getPaste().get().getDeletionKey().orElse("No deletion key"); String delKey = result.getPaste().get().getDeletionKey().orElse("No deletion key");
String url = "https://paste.gg/anonymous/" + result.getPaste().get().getId(); 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(Component.text("URL generated: ").append(Component.text().clickEvent(ClickEvent.openUrl(url)).content(url)));
audience.sendMessage(MiniMessage.miniMessage().parse((sender instanceof Player ? "<rainbow>" : "<green>") + "Deletion key:</rainbow> " + delKey)); audience.sendMessage(MiniMessage.miniMessage().deserialize((sender instanceof Player ? "<rainbow>" : "<green>") + "Deletion key:</rainbow> " + delKey));
} else { } else {
audience.sendMessage(MiniMessage.miniMessage().parse("<red>Failed to generate output. See console for details.")); audience.sendMessage(MiniMessage.miniMessage().deserialize("<red>Failed to generate output. See console for details."));
PlayerVaults.getInstance().getLogger().warning("Received: " + result.getMessage()); PlayerVaults.getInstance().getLogger().warning("Received: " + result.getMessage());
} }
} }
@@ -127,7 +127,7 @@ public class HelpMeCommand implements CommandExecutor {
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
PlayerVaults.getInstance().getPlatform().sender(sender).sendMessage(MiniMessage.miniMessage().parse("<red>Failed to generate output. See console for details.")); PlayerVaults.getInstance().getPlatform().sender(sender).sendMessage(MiniMessage.miniMessage().deserialize("<red>Failed to generate output. See console for details."));
} }
}.runTask(PlayerVaults.getInstance()); }.runTask(PlayerVaults.getInstance());
} }
@@ -6,7 +6,12 @@ import com.google.common.collect.ImmutableMap;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.platform.bukkit.BukkitComponentSerializer; import net.kyori.adventure.platform.bukkit.BukkitComponentSerializer;
import net.kyori.adventure.text.Component; 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.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.bukkit.command.CommandSender;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@@ -17,19 +22,12 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@SuppressWarnings("FieldMayBeFinal") @SuppressWarnings("FieldMayBeFinal")
public class Translation { public class Translation {
public static class TL extends ArrayList<String> { public static class TL extends ArrayList<String> {
private static transient PlayerVaults plugin; 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) { private static @NonNull TL of(@NonNull String... strings) {
TL list = new TL(); TL list = new TL();
@@ -44,6 +42,7 @@ public class Translation {
} }
public class Builder { public class Builder {
private transient String randomNum = "475087174643246031314442067831418947468567422217%%__USER__%%0876702565715325383665";
private transient ImmutableMap.Builder<String, String> map; private transient ImmutableMap.Builder<String, String> map;
private transient TL title; private transient TL title;
@@ -94,67 +93,24 @@ public class Translation {
private void send(@NonNull Audience audience, @NonNull Map<String, String> map, @Nullable TL title) { private void send(@NonNull Audience audience, @NonNull Map<String, String> map, @Nullable TL title) {
this.forEach(line -> { this.forEach(line -> {
Component component = this.getComponent(line, map, title); if (line == null || line.isEmpty()) {
if (component != null) { return;
audience.sendMessage(component);
} }
audience.sendMessage(this.getComponent(line, map, title));
}); });
} }
private @Nullable Component getComponent(@NonNull String line, @NonNull Map<String, String> map, @Nullable TL title) { private @NonNull Component getComponent(@NonNull String line, @NonNull Map<String, String> map, @Nullable TL title) {
if (title != null && !title.isEmpty()) { if (title != null && !title.isEmpty()) {
line = title.get(0) + line; line = title.get(0) + line;
} }
StringBuffer builder = null; TagResolver.Builder tagResolverBuilder = TagResolver.builder();
String found; TL.plugin.getTL().colorMappings().forEach((k, v) -> {
String foundDetails; TextColor color = v.startsWith("#") ? TextColor.fromHexString(v) : NamedTextColor.NAMES.value(v);
String repl; tagResolverBuilder.tag(k, Tag.styling(color == null ? NamedTextColor.WHITE : color));
String[] features; });
Matcher replMatcher = TL.REPLACEMENT_PATTERN.matcher(line); map.forEach((k, v) -> tagResolverBuilder.resolver(Placeholder.unparsed(k, v)));
while (replMatcher.find()) { return MiniMessage.miniMessage().deserialize(line, tagResolverBuilder.build());
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);
} }
public @NonNull String getLegacy() { public @NonNull String getLegacy() {
@@ -191,33 +147,33 @@ public class Translation {
} }
private static class Translations { private static class Translations {
private TL openVault = TL.of("<normal>Opening vault <info>{vault}</info>"); private TL openVault = TL.of("<normal>Opening vault <info><vault></info>");
private TL openOtherVault = TL.of("<normal>Opening vault <info>{vault}</info> of <info>{player}</info>"); private TL openOtherVault = TL.of("<normal>Opening vault <info><vault></info> of <info><player></info>");
private TL invalidArgs = TL.of("<error>Invalid args!"); private TL invalidArgs = TL.of("<error>Invalid args!");
private TL deleteVault = TL.of("<normal>Deleted vault <info>{vault}</info>"); private TL deleteVault = TL.of("<normal>Deleted vault <info><vault></info>");
private TL deleteOtherVault = TL.of("<normal>Deleted vault <info>{vault}</info> <normal>of <info>{player}</info>"); private TL deleteOtherVault = TL.of("<normal>Deleted vault <info><vault></info> <normal>of <info><player></info>");
private TL deleteOtherVaultAll = TL.of("<dark_red>Deleted all vaults belonging to <info>{player}</info>"); private TL deleteOtherVaultAll = TL.of("<dark_red>Deleted all vaults belonging to <info><player></info>");
private TL playerOnly = TL.of("<error>Sorry but that can only be run by a player!"); private TL playerOnly = TL.of("<error>Sorry but that can only be run by a player!");
private TL mustBeNumber = TL.of("<error>You need to specify a valid number."); private TL mustBeNumber = TL.of("<error>You need to specify a valid number.");
private TL noPerms = TL.of("<error>You don't have permission for that!"); private TL noPerms = TL.of("<error>You don't have permission for that!");
private TL insufficientFunds = TL.of("<error>You don't have enough money for that!"); private TL insufficientFunds = TL.of("<error>You don't have enough money for that!");
private TL refundAmount = TL.of("<normal>You were refunded <info>{price}</info> for deleting that vault."); private TL refundAmount = TL.of("<normal>You were refunded <info><price></info> for deleting that vault.");
private TL costToCreate = TL.of("<normal>You were charged <info>{price}</info> for creating a vault."); private TL costToCreate = TL.of("<normal>You were charged <info><price></info> for creating a vault.");
private TL costToOpen = TL.of("<normal>You were charged <info>{price}</info> for opening that vault."); private TL costToOpen = TL.of("<normal>You were charged <info><price></info> for opening that vault.");
private TL vaultDoesNotExist = TL.of("<error>That vault does not exist!"); private TL vaultDoesNotExist = TL.of("<error>That vault does not exist!");
private TL clickASign = TL.of("<normal>Now click a sign!"); private TL clickASign = TL.of("<normal>Now click a sign!");
private TL notASign = TL.of("<error>You must click a sign!"); private TL notASign = TL.of("<error>You must click a sign!");
private TL setSign = TL.of("<normal>You have successfully set a PlayerVault access sign!"); private TL setSign = TL.of("<normal>You have successfully set a PlayerVault access sign!");
private TL existingVaults = TL.of("<normal>{player} has vaults: <info>{vault}</info>"); private TL existingVaults = TL.of("<normal><player> has vaults: <info><vault></info>");
private TL vaultTitle = TL.of("<dark_red>Vault #{vault}"); private TL vaultTitle = TL.of("<dark_red>Vault #<vault>");
private TL openWithSign = TL.of("<normal>Opening vault <info>{vault}</info> of <info>{player}</info>"); private TL openWithSign = TL.of("<normal>Opening vault <info><vault></info> of <info><player></info>");
private TL noOwnerFound = TL.of("<error>Cannot find vault owner: <info>{player}</info>"); private TL noOwnerFound = TL.of("<error>Cannot find vault owner: <info><player></info>");
private TL convertPluginNotFound = TL.of("<error>No converter found for that plugin."); private TL convertPluginNotFound = TL.of("<error>No converter found for that plugin.");
private TL convertComplete = TL.of("<normal>Converted <info>{count}</info> players to PlayerVaults."); private TL convertComplete = TL.of("<normal>Converted <info><count></info> players to PlayerVaults.");
private TL convertBackground = TL.of("<normal>Conversion has been forked to the background. See console for updates."); private TL convertBackground = TL.of("<normal>Conversion has been forked to the background. See console for updates.");
private TL locked = TL.of("<error>Vaults are currently locked while conversion occurs. Please try again in a moment!"); private TL locked = TL.of("<error>Vaults are currently locked while conversion occurs. Please try again in a moment!");
private TL help = TL.of("/pv <number>"); private TL help = TL.of("/pv <number>");
private TL blockedItem = TL.of("<gold>{item}</gold> <error>is blocked from vaults."); private TL blockedItem = TL.of("<gold><item></gold> <error>is blocked from vaults.");
private TL signsDisabled = TL.of("<error>Vault signs are currently disabled."); private TL signsDisabled = TL.of("<error>Vault signs are currently disabled.");
private TL blockedBadItem = TL.of("<error>This item is not allowed in a vault."); private TL blockedBadItem = TL.of("<error>This item is not allowed in a vault.");
} }
@@ -127,6 +127,9 @@ public class Listeners implements Listener {
if (event.getHotbarButton() > -1 && event.getWhoClicked().getInventory().getItem(event.getHotbarButton()) != null) { if (event.getHotbarButton() > -1 && event.getWhoClicked().getInventory().getItem(event.getHotbarButton()) != null) {
items[1] = event.getWhoClicked().getInventory().getItem(event.getHotbarButton()); 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) { for (ItemStack item : items) {
if (item == null) { if (item == null) {