Updated Upstream (Paper)

Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@841da90 Paper Plugins (#8108)
PaperMC/Paper@7baf427 Fix plugin updater logic, allow null update directory (#8864)
This commit is contained in:
granny
2023-02-19 22:30:29 -08:00
parent 41593baf70
commit 9940dcf74b
45 changed files with 269 additions and 252 deletions

View File

@@ -3544,7 +3544,7 @@ index ebe65474a4a05ff1637d7f37ebcfe690af59def5..42142c512b12e5b269c19f1e821c50e7
@Nullable
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index f1a3d8dae2a61b875e423aebfdfcad2f77d498ff..5077c545e74711d5268d3cfa31926af1e995ea05 100644
index 621919a4a45caa73a43020fdca24764d95d89fd2..fdabf7f68d1fa12598e3803cf2d72054645393b1 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -261,7 +261,7 @@ import javax.annotation.Nullable; // Paper
@@ -3556,7 +3556,7 @@ index f1a3d8dae2a61b875e423aebfdfcad2f77d498ff..5077c545e74711d5268d3cfa31926af1
private final String serverVersion;
private final String bukkitVersion = Versioning.getBukkitVersion();
private final Logger logger = Logger.getLogger("Minecraft");
@@ -1067,6 +1067,11 @@ public final class CraftServer implements Server {
@@ -1048,6 +1048,11 @@ public final class CraftServer implements Server {
plugin.getDescription().getName(),
"This plugin is not properly shutting down its async tasks when it is being shut down. This task may throw errors during the final shutdown logs and might not complete before process dies."
));
@@ -3581,10 +3581,10 @@ index f7ea77dd82d978ad307f99c743efacfb34478b3d..009ab06182359862b8f543030ec4fe4e
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index 287e8c4c57ea1737460fdaf114e7eed627a25b2d..b9e4305f515faa14c2afc0ccaf23d205e9c9f858 100644
index 4c50d0422fcc6860e502f8b745aac2695f47073d..258db803682fcc4f76c792ef741b77e63a65ce98 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -462,7 +462,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@@ -468,7 +468,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@Override
public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {

View File

@@ -193,7 +193,7 @@ index 68d16efaf9c2d997afabadcf1ee24c5de685b5b3..861cd9f092a19aca520c2be4ba7a6ee3
public SystemReport fillSystemReport(SystemReport details) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 5077c545e74711d5268d3cfa31926af1e995ea05..0c75b7f595dc14c02f6384f786a3943f4e16bcef 100644
index fdabf7f68d1fa12598e3803cf2d72054645393b1..9f8f6ff6408a191012241846cce058b80969e5fe 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -261,7 +261,7 @@ import javax.annotation.Nullable; // Paper
@@ -259,10 +259,10 @@ index cdefb2025eedea7e204d70d568adaf1c1ec4c03c..d1526ed7197b883e1d1f07baf285bf5e
// (async tasks must live with race-conditions if they attempt to cancel between these few lines of code)
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index b9e4305f515faa14c2afc0ccaf23d205e9c9f858..feacdb99ce7ec21fb85b5a13be7a7cb530a40e21 100644
index 258db803682fcc4f76c792ef741b77e63a65ce98..a3a627eca3219d234c57ab491a30c770baf24395 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -462,7 +462,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@@ -468,7 +468,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@Override
public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {

View File

@@ -105,10 +105,10 @@ index 42299fd6ae663b01bb5f010b96887caa744dcb96..816f906f98adc180f37d2b216628e576
this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env);
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 0c75b7f595dc14c02f6384f786a3943f4e16bcef..0fcc3685f3f5b5c81a85f6981541f2cecc386da3 100644
index 9f8f6ff6408a191012241846cce058b80969e5fe..d633d9da06ea08b55a57fa4e9b8104ccb074385f 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -981,6 +981,7 @@ public final class CraftServer implements Server {
@@ -962,6 +962,7 @@ public final class CraftServer implements Server {
org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot
this.console.paperConfigurations.reloadConfigs(this.console);
@@ -116,7 +116,7 @@ index 0c75b7f595dc14c02f6384f786a3943f4e16bcef..0fcc3685f3f5b5c81a85f6981541f2ce
for (ServerLevel world : this.console.getAllLevels()) {
// world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty
world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean))
@@ -996,6 +997,7 @@ public final class CraftServer implements Server {
@@ -977,6 +978,7 @@ public final class CraftServer implements Server {
}
}
world.spigotConfig.init(); // Spigot
@@ -124,7 +124,7 @@ index 0c75b7f595dc14c02f6384f786a3943f4e16bcef..0fcc3685f3f5b5c81a85f6981541f2ce
}
Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper
@@ -1011,6 +1013,7 @@ public final class CraftServer implements Server {
@@ -992,6 +994,7 @@ public final class CraftServer implements Server {
this.reloadData();
org.spigotmc.SpigotConfig.registerCommands(); // Spigot
io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper
@@ -132,7 +132,7 @@ index 0c75b7f595dc14c02f6384f786a3943f4e16bcef..0fcc3685f3f5b5c81a85f6981541f2ce
this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*");
this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions");
@@ -2770,6 +2773,18 @@ public final class CraftServer implements Server {
@@ -2751,6 +2754,18 @@ public final class CraftServer implements Server {
return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console);
}

View File

@@ -17,10 +17,10 @@ index c7e4330c93baff1f3027d7c75cf857b673d38970..5134fed0cd0eedbe0c2177bce91b978b
public final boolean spawnNpcs = this.get("spawn-npcs", true);
public final boolean pvp = this.get("pvp", true);
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 0fcc3685f3f5b5c81a85f6981541f2cecc386da3..45f75ebc00f0e371066bb244a61c8d68a57c68c8 100644
index d633d9da06ea08b55a57fa4e9b8104ccb074385f..1528e8ec7d475e59d93b28a8874676afdb5c96ac 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -2960,4 +2960,11 @@ public final class CraftServer implements Server {
@@ -2941,4 +2941,11 @@ public final class CraftServer implements Server {
}
// Paper end

View File

@@ -25,10 +25,10 @@ index 70d3fc30e21a6c3c3d7a87ce2e43dd2eb8322b2c..7c731c72a19c43f4b291557310c632f3
}
// Spigot end
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 45f75ebc00f0e371066bb244a61c8d68a57c68c8..e451348e26c024d48dfccbc6f182544baef7ff3f 100644
index 1528e8ec7d475e59d93b28a8874676afdb5c96ac..d7279047dfe353ce9f4312ac0fc53623fa8d7a55 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -2966,5 +2966,10 @@ public final class CraftServer implements Server {
@@ -2947,5 +2947,10 @@ public final class CraftServer implements Server {
public String getServerName() {
return this.getProperties().serverName;
}

View File

@@ -69,10 +69,10 @@ index 779d14840fdb0b27e1bb49e680c59539294b2995..96f50760dec9fb7ec317b500ce5cd6a6
lagging = recentTps[0] < org.purpurmc.purpur.PurpurConfig.laggingThreshold; // Purpur
tickSection = curTime;
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index e451348e26c024d48dfccbc6f182544baef7ff3f..102302a6884b8a8cf850f25983bb48205af298b8 100644
index d7279047dfe353ce9f4312ac0fc53623fa8d7a55..10a63a0e67f061d68264a6ebe0209bb51bbef5fc 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -2727,6 +2727,7 @@ public final class CraftServer implements Server {
@@ -2708,6 +2708,7 @@ public final class CraftServer implements Server {
@Override
public double[] getTPS() {
return new double[] {

View File

@@ -51,10 +51,10 @@ index bbff7466cecf50285c97fadaf68682a6c6ea879f..5ae858b81e6f9903b7296077cf497f62
private int maxStack = MAX_STACK;
public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 102302a6884b8a8cf850f25983bb48205af298b8..ab3e5b4bfd3968d9d758d35bdcebfd7662dbb8a8 100644
index 10a63a0e67f061d68264a6ebe0209bb51bbef5fc..0fe1f103f1df37ecb879a6101dac2e9800623f6d 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -1455,6 +1455,19 @@ public final class CraftServer implements Server {
@@ -1436,6 +1436,19 @@ public final class CraftServer implements Server {
return true;
}

View File

@@ -3,54 +3,105 @@ From: Ben Kerllenevich <ben@omega24.dev>
Date: Sat, 25 Jun 2022 19:40:36 -0400
Subject: [PATCH] Spark Profiler
Co-authored-by: granny <granny@purpurmc.org>
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index cd1906a3dcb52de5deed02e1b0005fe83c91f211..97f357a6c8d600daf68b249e04da1f7008b14302 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -434,7 +434,44 @@ public final class CraftServer implements Server {
if (!pluginFolder.exists()) {
pluginFolder.mkdirs();
}
- Plugin[] plugins = this.pluginManager.loadPlugins(pluginFolder, this.extraPluginJars());
+ // Purpur start
+ List<File> extraJars = this.extraPluginJars();
+ if (!Boolean.getBoolean("Purpur.IReallyDontWantSpark")) {
+ try {
+ File file = new File("cache", "spark.jar");
+ file.getParentFile().mkdirs();
diff --git a/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java b/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java
new file mode 100644
index 0000000000000000000000000000000000000000..74e3334ec92e3864b84e299b33ca995224eb7c3f
--- /dev/null
+++ b/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java
@@ -0,0 +1,82 @@
+package io.papermc.paper.plugin.provider.source;
+
+ boolean shouldDownload = true;
+ if (file.exists()) {
+ String fileSha1 = String.format("%040x", new java.math.BigInteger(1, java.security.MessageDigest.getInstance("SHA-1").digest(java.nio.file.Files.readAllBytes(file.toPath()))));
+ String sparkSha1;
+ java.net.URLConnection urlConnection = new java.net.URL("https://sparkapi.lucko.me/download/bukkit/sha1").openConnection();
+ urlConnection.setReadTimeout(5000);
+ urlConnection.setConnectTimeout(5000);
+ try (java.io.BufferedReader reader = new java.io.BufferedReader(new InputStreamReader(urlConnection.getInputStream()))) {
+ sparkSha1 = reader.lines().collect(Collectors.joining(""));
+ }
+import com.mojang.logging.LogUtils;
+import io.papermc.paper.plugin.entrypoint.Entrypoint;
+import io.papermc.paper.plugin.entrypoint.EntrypointHandler;
+import io.papermc.paper.plugin.entrypoint.LaunchEntryPointHandler;
+import io.papermc.paper.plugin.provider.PluginProvider;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.math.BigInteger;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.security.MessageDigest;
+import java.util.stream.Collectors;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.slf4j.Logger;
+
+ if (fileSha1.equals(sparkSha1)) {
+ shouldDownload = false;
+ }
+public class SparkProviderSource extends FileProviderSource {
+ public static final SparkProviderSource INSTANCE = new SparkProviderSource();
+
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ public SparkProviderSource() {
+ super("File '%s' specified by Purpur"::formatted);
+ }
+
+ @Override
+ public void registerProviders(EntrypointHandler entrypointHandler, Path context) throws Exception {
+ if (!Boolean.getBoolean("Purpur.IReallyDontWantSpark")) {
+ try {
+ File file = context.toFile();
+ file.getParentFile().mkdirs();
+
+ boolean shouldDownload = true;
+ if (file.exists()) {
+ String fileSha1 = String.format("%040x", new BigInteger(1, MessageDigest.getInstance("SHA-1").digest(Files.readAllBytes(file.toPath()))));
+ String sparkSha1;
+ URLConnection urlConnection = new URL("https://sparkapi.lucko.me/download/bukkit/sha1").openConnection();
+ urlConnection.setReadTimeout(5000);
+ urlConnection.setConnectTimeout(5000);
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()))) {
+ sparkSha1 = reader.lines().collect(Collectors.joining(""));
+ }
+
+ if (shouldDownload) {
+ java.net.URLConnection urlConnection = new java.net.URL("https://sparkapi.lucko.me/download/bukkit").openConnection();
+ urlConnection.setReadTimeout(5000);
+ urlConnection.setConnectTimeout(5000);
+ java.nio.file.Files.copy(urlConnection.getInputStream(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
+ if (fileSha1.equals(sparkSha1)) {
+ shouldDownload = false;
+ }
+
+ extraJars.add(file);
+ } catch (Exception e) {
+ getLogger().severe("Purpur: Failed to download and install spark plugin");
+ e.printStackTrace();
+ }
+
+ if (shouldDownload) {
+ URLConnection urlConnection = new URL("https://sparkapi.lucko.me/download/bukkit").openConnection();
+ urlConnection.setReadTimeout(5000);
+ urlConnection.setConnectTimeout(5000);
+ Files.copy(urlConnection.getInputStream(), file.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ }
+
+ if (hasSpark()) {
+ LOGGER.info("Purpur: Using user-provided spark plugin instead of our own.");
+ } else {
+ super.registerProviders(entrypointHandler, context);
+ }
+
+ } catch (Exception e) {
+ LOGGER.error("Purpur: Failed to download and install spark plugin");
+ e.printStackTrace();
+ }
+ Plugin[] plugins = this.pluginManager.loadPlugins(pluginFolder, extraJars);
+ // Purpur end
+ }
+ }
+
+ private static boolean hasSpark() {
+ for (PluginProvider<JavaPlugin> provider : LaunchEntryPointHandler.INSTANCE.get(Entrypoint.PLUGIN).getRegisteredProviders()) {
+ if (provider.getMeta().getName().equalsIgnoreCase("spark")) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java
index a821cb33fbc29109aec68f9d6a0eb2efc121ee13..066b18444e92508908dd823c8d928721e338d06d 100644
--- a/src/main/java/net/minecraft/server/Main.java
+++ b/src/main/java/net/minecraft/server/Main.java
@@ -122,6 +122,7 @@ public class Main {
// Register plugins from the flag
io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.PluginFlagProviderSource.INSTANCE, files);
// Paper end
for (Plugin plugin : plugins) {
try {
+ io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.SparkProviderSource.INSTANCE, new File("cache", "spark.jar").toPath()); // Purpur
Bootstrap.bootStrap();
Bootstrap.validate();
Util.startTimerHackThread();

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Debug Marker API
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 39ca67f8b6b81b807f14e12137f4cb28d81bc5d4..799fdf506d57a729ccbb28da70678ccb1e02d152 100644
index 0fe1f103f1df37ecb879a6101dac2e9800623f6d..2bdabca25c75cbee0f53c1d50a07202bac9e1550 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -1503,6 +1503,42 @@ public final class CraftServer implements Server {
@@ -1447,6 +1447,42 @@ public final class CraftServer implements Server {
public void removeFuel(org.bukkit.Material material) {
net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity.removeFuel(net.minecraft.world.item.ItemStack.fromBukkitCopy(new ItemStack(material)));
}

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Language API
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 72d9726ac8d06502f6123aea039e026ad6529661..c32e32005968b46d1f7d5162ab15c61e36f398f5 100644
index 2bdabca25c75cbee0f53c1d50a07202bac9e1550..e5b5510806d183944f0ac926604e86f3b3dc1d7a 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -321,6 +321,20 @@ public final class CraftServer implements Server {
@@ -322,6 +322,20 @@ public final class CraftServer implements Server {
Bukkit.setServer(this);
io.papermc.paper.world.structure.PaperConfiguredStructure.init(); // Paper

View File

@@ -0,0 +1,123 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Parker Hawke <hawkeboyz2@hotmail.com>
Date: Sat, 27 Jun 2020 18:43:37 -0400
Subject: [PATCH] Improve output of plugins command
Co-authored-by: Oharass <oharass@bk.ru>
Co-authored-by: granny <granny@purpurmc.org>
diff --git a/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java b/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java
index 72096a66a4046633de73a12f5a043ac6dff169b1..a0200653bc7919a974e3ee6260edfb7cf4c221b4 100644
--- a/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java
+++ b/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java
@@ -78,10 +78,10 @@ public class PaperPluginsCommand extends BukkitCommand {
this.setAliases(Arrays.asList("pl"));
}
- private static <T> List<Component> formatProviders(TreeMap<String, PluginProvider<T>> plugins) {
+ private static <T> List<Component> formatProviders(TreeMap<String, PluginProvider<T>> plugins, @NotNull CommandSender sender) { // Purpur
List<Component> components = new ArrayList<>(plugins.size());
for (PluginProvider<T> entry : plugins.values()) {
- components.add(formatProvider(entry));
+ components.add(formatProvider(entry, sender)); // Purpur
}
boolean isFirst = true;
@@ -109,7 +109,7 @@ public class PaperPluginsCommand extends BukkitCommand {
return formattedSublists;
}
- private static Component formatProvider(PluginProvider<?> provider) {
+ private static Component formatProvider(PluginProvider<?> provider, @NotNull CommandSender sender) { // Purpur
TextComponent.Builder builder = Component.text();
if (provider instanceof SpigotPluginProvider spigotPluginProvider && CraftMagicNumbers.isLegacy(spigotPluginProvider.getMeta())) {
builder.append(LEGACY_PLUGIN_STAR);
@@ -117,12 +117,64 @@ public class PaperPluginsCommand extends BukkitCommand {
String name = provider.getMeta().getName();
Component pluginName = Component.text(name, fromStatus(provider))
- .clickEvent(ClickEvent.runCommand("/version " + name));
+ // Purpur start
+ .clickEvent(ClickEvent.suggestCommand("/version " + name));
+
+ if (sender instanceof org.bukkit.entity.Player && sender.hasPermission("bukkit.command.version")) {
+ // Event components
+ String description = provider.getMeta().getDescription();
+ TextComponent.Builder hover = Component.text();
+ hover.append(Component.text("Version: ", NamedTextColor.WHITE)).append(Component.text(provider.getMeta().getVersion(), NamedTextColor.GREEN));
+
+ if (description != null) {
+ hover.append(Component.newline())
+ .append(Component.text("Description: ", NamedTextColor.WHITE))
+ .append(Component.text(description, NamedTextColor.GREEN));
+ }
+
+ if (provider.getMeta().getWebsite() != null) {
+ hover.append(Component.newline())
+ .append(Component.text("Website: ", NamedTextColor.WHITE))
+ .append(Component.text(provider.getMeta().getWebsite(), NamedTextColor.GREEN));
+ }
+
+ if (!provider.getMeta().getAuthors().isEmpty()) {
+ hover.append(Component.newline());
+ if (provider.getMeta().getAuthors().size() == 1) {
+ hover.append(Component.text("Author: "));
+ } else {
+ hover.append(Component.text("Authors: "));
+ }
+
+ hover.append(getAuthors(provider.getMeta()));
+ }
+
+ pluginName.hoverEvent(hover.build());
+ }
builder.append(pluginName);
+ // Purpur end
+
+ return builder.build();
+ }
+
+ // Purpur start
+ @NotNull
+ private static TextComponent getAuthors(@NotNull final PluginMeta pluginMeta) {
+ TextComponent.Builder builder = Component.text();
+ List<String> authors = pluginMeta.getAuthors();
+
+ for (int i = 0; i < authors.size(); i++) {
+ if (i > 0) {
+ builder.append(Component.text(i < authors.size() - 1 ? ", " : " and ", NamedTextColor.WHITE));
+ }
+
+ builder.append(Component.text(authors.get(i), NamedTextColor.GREEN));
+ }
return builder.build();
}
+ // Purpur end
private static Component asPlainComponents(String strings) {
net.kyori.adventure.text.TextComponent.Builder builder = Component.text();
@@ -182,16 +234,16 @@ public class PaperPluginsCommand extends BukkitCommand {
}
}
- Component infoMessage = Component.text("Server Plugins (%s):".formatted(paperPlugins.size() + spigotPlugins.size()), NamedTextColor.WHITE);
+ //Component infoMessage = Component.text("Server Plugins (%s):".formatted(paperPlugins.size() + spigotPlugins.size()), NamedTextColor.WHITE);
//.append(INFO_ICON_START.hoverEvent(SERVER_PLUGIN_INFO)); TODO: Add docs
- sender.sendMessage(infoMessage);
- sender.sendMessage(PAPER_HEADER);
- for (Component component : formatProviders(paperPlugins)) {
+ //sender.sendMessage(infoMessage); // Purpur
+ sender.sendMessage(PAPER_HEADER.append(Component.text(" (%s):".formatted(paperPlugins.size())))); // Purpur
+ for (Component component : formatProviders(paperPlugins, sender)) { // Purpur
sender.sendMessage(component);
}
- sender.sendMessage(BUKKIT_HEADER);
- for (Component component : formatProviders(spigotPlugins)) {
+ sender.sendMessage(BUKKIT_HEADER.append(Component.text(" (%s):".formatted(spigotPlugins.size())))); // Purpur
+ for (Component component : formatProviders(spigotPlugins, sender)) { // Purpur
sender.sendMessage(component);
}