From b4e60b7db54bf7e1d05c20cfabd25b14ccbfad3c Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 30 Mar 2023 12:47:23 +0200 Subject: [PATCH 01/42] Prevent loading of extensions outside of the expansions folder using the register command --- .../commands/impl/local/CommandExpansionRegister.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionRegister.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionRegister.java index c6085b6..260f03d 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionRegister.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionRegister.java @@ -54,7 +54,7 @@ public final class CommandExpansionRegister extends PlaceholderCommand { final LocalExpansionManager manager = plugin.getLocalExpansionManager(); final File file = new File(manager.getExpansionsFolder(), params.get(0)); - if (!file.exists()) { + if (!file.exists() || !file.getParentFile().equals(manager.getExpansionsFolder())) { Msg.msg(sender, "&cThe file &f" + file.getName() + "&c doesn't exist!"); return; From ecd4c002c822fb91264385f37016b0f39ed042f3 Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 30 Mar 2023 13:41:01 +0200 Subject: [PATCH 02/42] Add environment variable to block individual ecloud expansions. This commit adds the environment variable "PAPI_BLOCKED_EXPANSIONS" which can contain a case insensitive, comma separated list of blocked expansions. Expansions on this list can no longer be downloaded using commands. --- .../impl/cloud/CommandECloudDownload.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java index 5717447..abe04f9 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java @@ -20,6 +20,7 @@ package me.clip.placeholderapi.commands.impl.cloud; +import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Stream; @@ -37,6 +38,16 @@ public final class CommandECloudDownload extends PlaceholderCommand { super("download"); } + private boolean isBlockedExpansion(String name) { + String env = System.getenv("PAPI_BLOCKED_EXPANSIONS"); + if (env == null) { + return false; + } + + return Arrays.stream(env.split(",")) + .anyMatch(s -> s.equalsIgnoreCase(name)); + } + @Override public void evaluate(@NotNull final PlaceholderAPIPlugin plugin, @NotNull final CommandSender sender, @NotNull final String alias, @@ -47,6 +58,12 @@ public final class CommandECloudDownload extends PlaceholderCommand { return; } + if (isBlockedExpansion(params.get(0))) { + Msg.msg(sender, + "&cThis expansion can't be downloaded."); + return; + } + final CloudExpansion expansion = plugin.getCloudExpansionManager() .findCloudExpansionByName(params.get(0)).orElse(null); if (expansion == null) { From 28287c7fbd54966841544853986736f4fbcd3689 Mon Sep 17 00:00:00 2001 From: Andre601 Date: Sat, 10 Jun 2023 17:59:55 +0200 Subject: [PATCH 03/42] 1.20 NMS version support --- src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java b/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java index 37c18b8..c49edfa 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java +++ b/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java @@ -46,7 +46,8 @@ public enum NMSVersion { SPIGOT_1_18_R1("v1_18_R1"), SPIGOT_1_19_R1("v1_19_R1"), SPIGOT_1_19_R2("v1_19_R2"), - SPIGOT_1_19_R3("v1_19_R3"); + SPIGOT_1_19_R3("v1_19_R3"), + SPIGOT_1_20_R1("v1_20_R1"); private final String version; From 74d8fec6bde7d45ea212f13c830aa13126acf98b Mon Sep 17 00:00:00 2001 From: Andre601 Date: Sat, 10 Jun 2023 18:13:10 +0200 Subject: [PATCH 04/42] Bump Spigot version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index ba02025..83cb0ca 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,7 +26,7 @@ dependencies { implementation("org.bstats:bstats-bukkit:3.0.1") implementation("net.kyori:adventure-platform-bukkit:4.3.0") - compileOnly("org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT") + compileOnly("org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") compileOnlyApi("org.jetbrains:annotations:23.0.0") testImplementation("org.openjdk.jmh:jmh-core:1.32") From f91b4e3752de1c476494df816170a1f9aef0fd76 Mon Sep 17 00:00:00 2001 From: Gabriel Dumitru Date: Wed, 21 Jun 2023 21:26:52 +0300 Subject: [PATCH 05/42] feat: fetch all expansions (#952) --- .../commands/impl/cloud/CommandECloudDownload.java | 9 ++++++--- .../commands/impl/cloud/CommandECloudRefresh.java | 4 +--- .../expansion/manager/CloudExpansionManager.java | 9 +++------ 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java index abe04f9..060d56c 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java @@ -72,6 +72,11 @@ public final class CommandECloudDownload extends PlaceholderCommand { return; } + if (!expansion.isVerified() && !plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions()) { + Msg.msg(sender, "&cThe expansion '&f" + params.get(0) + "&c' is not verified and can only be downloaded manually from &fhttps://placeholderapi.com/ecloud"); + return; + } + final CloudExpansion.Version version; if (params.size() < 2) { version = expansion.getVersion(expansion.getLatestVersion()); @@ -103,9 +108,7 @@ public final class CommandECloudDownload extends PlaceholderCommand { .getVersion() + "] &ato file: &f" + file.getName(), "&aMake sure to type &f/papi reload &ato enable your new expansion!"); - plugin.getCloudExpansionManager().clean(); - plugin.getCloudExpansionManager() - .fetch(plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions()); + plugin.getCloudExpansionManager().load(); }); } diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudRefresh.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudRefresh.java index fb11086..e82b407 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudRefresh.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudRefresh.java @@ -38,9 +38,7 @@ public final class CommandECloudRefresh extends PlaceholderCommand { public void evaluate(@NotNull final PlaceholderAPIPlugin plugin, @NotNull final CommandSender sender, @NotNull final String alias, @NotNull @Unmodifiable final List params) { - plugin.getCloudExpansionManager().clean(); - plugin.getCloudExpansionManager() - .fetch(plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions()); + plugin.getCloudExpansionManager().load(); Msg.msg(sender, "&aThe eCloud manager has been refreshed!"); diff --git a/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java b/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java index 11d7cb3..19dc77c 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java +++ b/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java @@ -100,7 +100,7 @@ public final class CloudExpansionManager { public void load() { clean(); - fetch(plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions()); + fetch(); } public void kill() { @@ -170,7 +170,7 @@ public final class CloudExpansionManager { await.clear(); } - public void fetch(final boolean allowUnverified) { + public void fetch() { plugin.getLogger().info("Fetching available expansion information..."); ASYNC_EXECUTOR.submit( @@ -190,9 +190,6 @@ public final class CloudExpansionManager { || expansion.getVersion(expansion.getLatestVersion()) == null) { toRemove.add(entry.getKey()); } - if (!allowUnverified && !expansion.isVerified()) { - toRemove.add(entry.getKey()); - } } for (String name : toRemove) { @@ -203,7 +200,7 @@ public final class CloudExpansionManager { plugin.getLogger().log(Level.WARNING, "Failed to download expansion information", e); } - // loop thru what's left on the main thread + // loop through what's left on the main thread plugin .getServer() .getScheduler() From 92a7d546644ba83e71de2733fd42499f9be7046c Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 23 Jun 2023 14:00:24 +0200 Subject: [PATCH 06/42] Add environment variable to override cloud_allowunverified_expansions This adds the environment variable PAPI_ALLOW_UNVERIFIED_EXPANSIONS. It allows overriding the option set in the config.yml. --- .../impl/cloud/CommandECloudDownload.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java index 060d56c..2df77fb 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java @@ -48,6 +48,24 @@ public final class CommandECloudDownload extends PlaceholderCommand { .anyMatch(s -> s.equalsIgnoreCase(name)); } + private boolean areUnverifiedExpansionsAllowed(@NotNull final PlaceholderAPIPlugin plugin) { + String env = System.getenv("PAPI_ALLOW_UNVERIFIED_EXPANSIONS"); + if (env != null) { + switch (env.toLowerCase()) { + case "true": + case "yes": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + } + } + + return plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions(); + } + @Override public void evaluate(@NotNull final PlaceholderAPIPlugin plugin, @NotNull final CommandSender sender, @NotNull final String alias, @@ -72,7 +90,7 @@ public final class CommandECloudDownload extends PlaceholderCommand { return; } - if (!expansion.isVerified() && !plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions()) { + if (!expansion.isVerified() && !this.areUnverifiedExpansionsAllowed(plugin)) { Msg.msg(sender, "&cThe expansion '&f" + params.get(0) + "&c' is not verified and can only be downloaded manually from &fhttps://placeholderapi.com/ecloud"); return; } From 42cfe1dc804c113432ceabcf10c81a11d3951cc9 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 23 Jun 2023 17:06:11 +0200 Subject: [PATCH 07/42] simplify env values to true/false --- .../commands/impl/cloud/CommandECloudDownload.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java index 2df77fb..c34bf89 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java @@ -51,16 +51,7 @@ public final class CommandECloudDownload extends PlaceholderCommand { private boolean areUnverifiedExpansionsAllowed(@NotNull final PlaceholderAPIPlugin plugin) { String env = System.getenv("PAPI_ALLOW_UNVERIFIED_EXPANSIONS"); if (env != null) { - switch (env.toLowerCase()) { - case "true": - case "yes": - case "1": - return true; - case "false": - case "no": - case "0": - return false; - } + return env.equalsIgnoreCase("true"); } return plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions(); From 36fa9ac96dff1444c2d53ce24c37110a34c43c17 Mon Sep 17 00:00:00 2001 From: Gabriel Dumitru Date: Mon, 24 Jul 2023 11:48:29 +0300 Subject: [PATCH 08/42] feat: distinguish expansions (external or internal) (fixes #945) (#953) --- .../expansion/PlaceholderExpansion.java | 50 +++++++++++++++++-- .../manager/LocalExpansionManager.java | 32 ++++++++---- 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java b/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java index 5cd3029..a41be94 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java +++ b/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java @@ -40,6 +40,14 @@ import org.jetbrains.annotations.Nullable; */ public abstract class PlaceholderExpansion extends PlaceholderHook { + /** + * The type is {@link Type#INTERNAL} by default. + * For external expansions, the type is updated on {@link me.clip.placeholderapi.expansion.manager.LocalExpansionManager#register(Class) register}. + * @since 2.11.4 + */ + @ApiStatus.Internal + protected Type expansionType = Type.INTERNAL; + /** * The placeholder identifier of this expansion. May not contain {@literal %}, * {@literal {}} or _ @@ -159,6 +167,27 @@ public abstract class PlaceholderExpansion extends PlaceholderHook { return PlaceholderAPIPlugin.getInstance(); } + /** + * Get the type of the expansion + * + * @return the type of the expansion + * @since 2.11.4 + */ + @ApiStatus.Internal + public Type getExpansionType() { + return expansionType; + } + + /** + * Set the type of the expansion + * @param expansionType the new type + * @since 2.11.4 + */ + @ApiStatus.Internal + public void setExpansionType(Type expansionType) { + this.expansionType = expansionType; + } + // === Configuration === /** @@ -166,7 +195,7 @@ public abstract class PlaceholderExpansion extends PlaceholderHook { * null when not specified. *
You may use the {@link Configurable} interface to define default values set * - * @return ConfigurationSection that this epxpansion has. + * @return ConfigurationSection that this expansion has. */ @Nullable public final ConfigurationSection getConfigSection() { @@ -394,8 +423,8 @@ public abstract class PlaceholderExpansion extends PlaceholderHook { */ @Override public final String toString() { - return String.format("PlaceholderExpansion[name: '%s', author: '%s', version: '%s']", getName(), - getAuthor(), getVersion()); + return String.format("PlaceholderExpansion[name: '%s', author: '%s', version: '%s', type: '%s']", getName(), + getAuthor(), getVersion(), getExpansionType()); } // === Deprecated API === @@ -432,4 +461,19 @@ public abstract class PlaceholderExpansion extends PlaceholderHook { public String getLink() { return null; } + + public enum Type { + + /** + * An expansion provided by a plugin is considered internal + */ + INTERNAL, + + /** + * An expansion loaded from the expansions folder is considered external + */ + EXTERNAL + + } + } diff --git a/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java b/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java index 80c785a..8e6cbd0 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java +++ b/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java @@ -187,6 +187,8 @@ public final class LocalExpansionManager implements Listener { return Optional.empty(); } } + + expansion.setExpansionType(PlaceholderExpansion.Type.EXTERNAL); if (!expansion.register()) { Msg.warn("Cannot load expansion %s due to an unknown issue.", expansion.getIdentifier()); @@ -209,6 +211,11 @@ public final class LocalExpansionManager implements Listener { return Optional.empty(); } + /** + * Attempt to register a {@link PlaceholderExpansion} + * @param expansion the expansion to register + * @return if the expansion was registered + */ @ApiStatus.Internal public boolean register(@NotNull final PlaceholderExpansion expansion) { final String identifier = expansion.getIdentifier().toLowerCase(Locale.ROOT); @@ -216,10 +223,10 @@ public final class LocalExpansionManager implements Listener { if (!expansion.canRegister()) { return false; } - - if (expansions.containsKey(identifier)) { - Msg.warn("Failed to load expansion %s. Identifier is already in use.", - expansion.getIdentifier()); + + // Avoid loading two external expansions with the same identifier + if (expansion.getExpansionType() == PlaceholderExpansion.Type.EXTERNAL && expansions.containsKey(identifier)) { + Msg.warn("Failed to load external expansion %s. Identifier is already in use.", expansion.getIdentifier()); return false; } @@ -287,21 +294,24 @@ public final class LocalExpansionManager implements Listener { Bukkit.getPluginManager().registerEvents(((Listener) expansion), plugin); } - Msg.info("Successfully registered expansion: %s [%s]", expansion.getIdentifier(), - expansion.getVersion()); + Msg.info( + "Successfully registered %s expansion: %s [%s]", + expansion.getExpansionType().name().toLowerCase(), + expansion.getIdentifier(), + expansion.getVersion() + ); if (expansion instanceof Taskable) { ((Taskable) expansion).start(); } - if (plugin.getPlaceholderAPIConfig().isCloudEnabled()) { - final Optional cloudExpansionOptional = - plugin.getCloudExpansionManager().findCloudExpansionByName(identifier); + // Check eCloud for updates only if the expansion is external + if (plugin.getPlaceholderAPIConfig().isCloudEnabled() && expansion.getExpansionType() == PlaceholderExpansion.Type.EXTERNAL) { + final Optional cloudExpansionOptional = plugin.getCloudExpansionManager().findCloudExpansionByName(identifier); if (cloudExpansionOptional.isPresent()) { CloudExpansion cloudExpansion = cloudExpansionOptional.get(); cloudExpansion.setHasExpansion(true); - cloudExpansion.setShouldUpdate( - !cloudExpansion.getLatestVersion().equals(expansion.getVersion())); + cloudExpansion.setShouldUpdate(!cloudExpansion.getLatestVersion().equals(expansion.getVersion())); } } From 195158b18b1065419f7983142e24c1064fe53b33 Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Tue, 1 Aug 2023 03:27:15 +0200 Subject: [PATCH 09/42] Use new format for note block [skip ci] --- .github/label-commenter-config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/label-commenter-config.yml b/.github/label-commenter-config.yml index 852b4bb..91e76fa 100644 --- a/.github/label-commenter-config.yml +++ b/.github/label-commenter-config.yml @@ -1,8 +1,8 @@ comment: footer: "\ - ----\n\n - > **Note**\n - > *This is an automated response created by a **GitHub Action***\n + ----

+ > [!NOTE]
+ > *This is an automated response created by a **GitHub Action***
> *Mentioning the bot won't have any effect!* " From be956f52b0d55a80a21e454531fb5daabfffb497 Mon Sep 17 00:00:00 2001 From: mfnalex Date: Tue, 29 Aug 2023 00:55:28 +0200 Subject: [PATCH 10/42] added missing @NotNull to return value and List parameter of setBracketPlaceholders(Player, List) --- src/main/java/me/clip/placeholderapi/PlaceholderAPI.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java b/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java index a5228db..d26ee96 100644 --- a/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java +++ b/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java @@ -162,7 +162,8 @@ public final class PlaceholderAPI { * @param text List of Strings to set the placeholder values in * @return String containing all translated placeholders */ - public static List setBracketPlaceholders(Player player, List text) { + @NotNull + public static List setBracketPlaceholders(Player player, @NotNull List text) { return setBracketPlaceholders((OfflinePlayer) player, text); } From 152105017dcec7921a6a5cb7374a676493fb40e9 Mon Sep 17 00:00:00 2001 From: mfnalex Date: Tue, 29 Aug 2023 00:56:12 +0200 Subject: [PATCH 11/42] added missing @NotNull to return value and String parameter of setBracketPlaceholders(Player, String) --- src/main/java/me/clip/placeholderapi/PlaceholderAPI.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java b/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java index d26ee96..632bd62 100644 --- a/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java +++ b/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java @@ -150,7 +150,8 @@ public final class PlaceholderAPI { * @param text Text to set the placeholder values in * @return String containing all translated placeholders */ - public static String setBracketPlaceholders(Player player, String text) { + @NotNull + public static String setBracketPlaceholders(Player player, @NotNull String text) { return setBracketPlaceholders((OfflinePlayer) player, text); } From 32f3d14682f4d85ebce4c361515bd4f4ee84261a Mon Sep 17 00:00:00 2001 From: mfnalex Date: Tue, 29 Aug 2023 00:57:42 +0200 Subject: [PATCH 12/42] added missing @NotNull to the returned List's type parameter and the parameter List's type parameter (is that proper English?) --- src/main/java/me/clip/placeholderapi/PlaceholderAPI.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java b/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java index 632bd62..366ef63 100644 --- a/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java +++ b/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java @@ -136,8 +136,8 @@ public final class PlaceholderAPI { * @return String containing all translated placeholders */ @NotNull - public static List setBracketPlaceholders(final OfflinePlayer player, - @NotNull final List text) { + public static List<@NotNull String> setBracketPlaceholders(final OfflinePlayer player, + @NotNull final List<@NotNull String> text) { return text.stream().map(line -> setBracketPlaceholders(player, line)) .collect(Collectors.toList()); } From 5b1a8ef4ba88c68a2cbd13f3d1d5c8cde57691f2 Mon Sep 17 00:00:00 2001 From: Funnycube <6916389+Funny-cube@users.noreply.github.com> Date: Sun, 24 Sep 2023 12:40:46 +1000 Subject: [PATCH 13/42] 2.11.4 release --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 83cb0ca..5205abb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "me.clip" -version = "2.11.4-DEV-${System.getProperty("BUILD_NUMBER")}" +version = "2.11.4" description = "An awesome placeholder provider!" From c0f824450e4ceeae5f119e165a8acd708488a7ee Mon Sep 17 00:00:00 2001 From: Funnycube <6916389+Funny-cube@users.noreply.github.com> Date: Sun, 24 Sep 2023 12:59:01 +1000 Subject: [PATCH 14/42] Update build.gradle.kts start 2.11.5-DEV --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5205abb..159dd02 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "me.clip" -version = "2.11.4" +version = "2.11.5-DEV-${System.getProperty("BUILD_NUMBER")}" description = "An awesome placeholder provider!" From d35a499e31d2920824214093b9bd93ff8c52b4a3 Mon Sep 17 00:00:00 2001 From: Funnycube <6916389+Funny-cube@users.noreply.github.com> Date: Sun, 24 Sep 2023 13:49:40 +1000 Subject: [PATCH 15/42] Update plugin.yml remove unused toggle permissions --- src/main/resources/plugin.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 077b274..84c3f5f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -37,7 +37,6 @@ permissions: placeholderapi.ecloud.info: true placeholderapi.ecloud.list: true placeholderapi.ecloud.clear: true - placeholderapi.ecloud.toggle: true placeholderapi.ecloud.status: true placeholderapi.ecloud.update: true placeholderapi.ecloud.refresh: true @@ -82,9 +81,6 @@ permissions: placeholderapi.ecloud.clear: default: "op" description: "Allows you to clear the local eCloud expansion cache" - placeholderapi.ecloud.toggle: - default: "op" - description: "Allows you to toggle/enable/disable the eCloud manager" placeholderapi.ecloud.status: default: "op" description: "Allows you to view the status of eCloud expansions" @@ -99,4 +95,4 @@ permissions: description: "Allows you to download an expansion from the eCloud" placeholderapi.ecloud.placeholders: default: "op" - description: "Allows you to view the placeholders of a eCloud expansion" \ No newline at end of file + description: "Allows you to view the placeholders of a eCloud expansion" From af0b47533051105097a47f86623e98fbe68f5718 Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Mon, 25 Sep 2023 14:58:30 +0200 Subject: [PATCH 16/42] Add Hangar and BuiltByBit pages to readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index a6c7291..d8498f2 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ [discord]: https://helpch.at/discord [spigot]: https://www.spigotmc.org/resources/6245/ +[hangar]: https://hangar.papermc.io/HelpChat/PlaceholderAPI +[bbb]: https://builtbybit.com/resources/placeholderapi.24306 [Expansions cloud]: https://api.extendedclip.com/home [placeholder list]: https://helpch.at/placeholders [statistics]: https://bstats.org/plugin/bukkit/PlaceholderAPI @@ -47,4 +49,6 @@ If you would like to create your own Placeholder Expansion for PlaceholderAPI, t - [Expansions Cloud] - [Placeholder List] - [Spigot Page][spigot] +- [Hangar Page][hangar] +- [Build By Bit][bbb] - [Plugin Statistics][statistics] From d3646a98745246209698d5bb96a35479849abd11 Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Mon, 25 Sep 2023 15:07:13 +0200 Subject: [PATCH 17/42] Change Built By Bit to BuiltByBit Page --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d8498f2..8afc969 100644 --- a/README.md +++ b/README.md @@ -50,5 +50,5 @@ If you would like to create your own Placeholder Expansion for PlaceholderAPI, t - [Placeholder List] - [Spigot Page][spigot] - [Hangar Page][hangar] -- [Build By Bit][bbb] +- [BuildByBit Page][bbb] - [Plugin Statistics][statistics] From 491abd6238444256636f62fe5f3e16eaa79566af Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Mon, 25 Sep 2023 15:11:49 +0200 Subject: [PATCH 18/42] BuilT not BuilD --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8afc969..b58a493 100644 --- a/README.md +++ b/README.md @@ -50,5 +50,5 @@ If you would like to create your own Placeholder Expansion for PlaceholderAPI, t - [Placeholder List] - [Spigot Page][spigot] - [Hangar Page][hangar] -- [BuildByBit Page][bbb] +- [BuiltByBit Page][bbb] - [Plugin Statistics][statistics] From c7a4900aa316dc1a7ee94772e8894d15e2520264 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Sat, 28 Oct 2023 21:42:18 +0800 Subject: [PATCH 19/42] remove ability to download unverified expansions --- build.gradle.kts | 2 +- .../commands/impl/cloud/CommandECloudDownload.java | 11 +---------- .../configuration/PlaceholderAPIConfig.java | 4 ---- src/main/resources/config.yml | 1 - 4 files changed, 2 insertions(+), 16 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 159dd02..68d7ae5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,7 @@ repositories { dependencies { implementation("org.bstats:bstats-bukkit:3.0.1") - implementation("net.kyori:adventure-platform-bukkit:4.3.0") + implementation("net.kyori:adventure-platform-bukkit:4.3.1") compileOnly("org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") compileOnlyApi("org.jetbrains:annotations:23.0.0") diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java index c34bf89..7e30cdc 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java @@ -48,15 +48,6 @@ public final class CommandECloudDownload extends PlaceholderCommand { .anyMatch(s -> s.equalsIgnoreCase(name)); } - private boolean areUnverifiedExpansionsAllowed(@NotNull final PlaceholderAPIPlugin plugin) { - String env = System.getenv("PAPI_ALLOW_UNVERIFIED_EXPANSIONS"); - if (env != null) { - return env.equalsIgnoreCase("true"); - } - - return plugin.getPlaceholderAPIConfig().cloudAllowUnverifiedExpansions(); - } - @Override public void evaluate(@NotNull final PlaceholderAPIPlugin plugin, @NotNull final CommandSender sender, @NotNull final String alias, @@ -81,7 +72,7 @@ public final class CommandECloudDownload extends PlaceholderCommand { return; } - if (!expansion.isVerified() && !this.areUnverifiedExpansionsAllowed(plugin)) { + if (!expansion.isVerified()) { Msg.msg(sender, "&cThe expansion '&f" + params.get(0) + "&c' is not verified and can only be downloaded manually from &fhttps://placeholderapi.com/ecloud"); return; } diff --git a/src/main/java/me/clip/placeholderapi/configuration/PlaceholderAPIConfig.java b/src/main/java/me/clip/placeholderapi/configuration/PlaceholderAPIConfig.java index e10733e..1b355dc 100644 --- a/src/main/java/me/clip/placeholderapi/configuration/PlaceholderAPIConfig.java +++ b/src/main/java/me/clip/placeholderapi/configuration/PlaceholderAPIConfig.java @@ -38,10 +38,6 @@ public final class PlaceholderAPIConfig { return plugin.getConfig().getBoolean("check_updates"); } - public boolean cloudAllowUnverifiedExpansions() { - return plugin.getConfig().getBoolean("cloud_allow_unverified_expansions"); - } - public boolean isCloudEnabled() { return plugin.getConfig().getBoolean("cloud_enabled"); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6fa0861..5d1b8f2 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -11,7 +11,6 @@ check_updates: true cloud_enabled: true cloud_sorting: "name" -cloud_allow_unverified_expansions: false boolean: 'true': 'yes' 'false': 'no' From b64f024eb2861990613bcb2facd00df976e62545 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Sat, 28 Oct 2023 21:49:39 +0800 Subject: [PATCH 20/42] fix config version variable and set release version --- build.gradle.kts | 2 +- src/main/resources/config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 68d7ae5..9ba2e47 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "me.clip" -version = "2.11.5-DEV-${System.getProperty("BUILD_NUMBER")}" +version = "2.11.5" description = "An awesome placeholder provider!" diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 5d1b8f2..0a414ab 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ # PlaceholderAPI -# Version: @version@ +# Version: ${version} # Created by: extended_clip # Contributors: https://github.com/PlaceholderAPI/PlaceholderAPI/graphs/contributors # Issues: https://github.com/PlaceholderAPI/PlaceholderAPI/issues From 57fa68c89689a6dfb4a9fa0d6c7a767ca2f14793 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Sat, 28 Oct 2023 21:50:05 +0800 Subject: [PATCH 21/42] change version to .6-dev --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9ba2e47..1810fa6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "me.clip" -version = "2.11.5" +version = "2.11.6-DEV-${System.getProperty("BUILD_NUMBER")}" description = "An awesome placeholder provider!" From 2c7767e77d9b062088bec80f85eb5b570bcca3d0 Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Mon, 22 Jan 2024 20:12:39 +0100 Subject: [PATCH 22/42] fix github admonition blocks --- .github/label-commenter-config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/label-commenter-config.yml b/.github/label-commenter-config.yml index 91e76fa..a8922ea 100644 --- a/.github/label-commenter-config.yml +++ b/.github/label-commenter-config.yml @@ -1,7 +1,7 @@ comment: footer: "\ - ----

- > [!NOTE]
+ ----\n\n + > [!NOTE]\n > *This is an automated response created by a **GitHub Action***
> *Mentioning the bot won't have any effect!* " From 2e67272aeaf2ffad23654b3f69eff647e2f1c62b Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Fri, 26 Jan 2024 23:05:04 +0100 Subject: [PATCH 23/42] Fix logo and update link in README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b58a493..549700d 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,10 @@ [ciImg]: http://ci.extendedclip.com/buildStatus/icon?job=PlaceholderAPI [APIversionImg]: https://img.shields.io/nexus/placeholderapi/me.clip/placeholderapi?server=https%3A%2F%2Frepo.extendedclip.com&label=API%20Version -[logo]: https://raw.githubusercontent.com/PlaceholderAPI/PlaceholderAPI/wiki/img/papi-logo.png +[logo]: https://wiki.placeholderapi.com/assets/img/papi-logo.png [contributing]: https://github.com/PlaceholderAPI/PlaceholderAPI/blob/master/.github/CONTRIBUTING.md -[placeholderexpansion]: https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/PlaceholderExpansion +[placeholderexpansion]: https://wiki.placeholderapi.com/developers/creating-a-placeholderexpansion/ [![logo]][spigot] From b96e535aaac3707bc96616c3774fd9bd97e60b4f Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Sat, 27 Jan 2024 00:58:11 +0100 Subject: [PATCH 24/42] Update wiki link in PR template --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 87244dc..f8075c7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -25,4 +25,4 @@ Closes N/A -[Wiki]: https://github.com/PlaceholderAPI/PlaceholderAPI/wiki +[Wiki]: https://wiki.placeholderapi.com From a83ef75bf9db7739ddaf800010c5cbad35d3a580 Mon Sep 17 00:00:00 2001 From: Funnycube <6916389+Funny-cube@users.noreply.github.com> Date: Sat, 27 Jan 2024 20:45:10 +1100 Subject: [PATCH 25/42] Update config.yml --- src/main/resources/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0a414ab..26f937a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -3,8 +3,8 @@ # Created by: extended_clip # Contributors: https://github.com/PlaceholderAPI/PlaceholderAPI/graphs/contributors # Issues: https://github.com/PlaceholderAPI/PlaceholderAPI/issues -# Expansions: https://api.extendedclip.com/all/ -# Wiki: https://github.com/PlaceholderAPI/PlaceholderAPI/wiki +# Expansions: https://placeholderapi.com/ecloud +# Wiki: https://wiki.placeholderapi.com/ # Discord: https://helpch.at/discord # No placeholders are provided with this plugin by default. # Download placeholders: /papi ecloud From 403622d205386597127f17495e104a56671e3436 Mon Sep 17 00:00:00 2001 From: Ricardo Borutta Date: Mon, 29 Jan 2024 10:21:24 +0100 Subject: [PATCH 26/42] Use the OfflinePlayer$getPlayer method instead of casting to Player class You should use this to avoid a class cast exception if some other plugins uses an own Implementation of the offline player. --- src/main/java/me/clip/placeholderapi/PlaceholderHook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/PlaceholderHook.java b/src/main/java/me/clip/placeholderapi/PlaceholderHook.java index 622260f..9e7478f 100644 --- a/src/main/java/me/clip/placeholderapi/PlaceholderHook.java +++ b/src/main/java/me/clip/placeholderapi/PlaceholderHook.java @@ -29,7 +29,7 @@ public abstract class PlaceholderHook { @Nullable public String onRequest(final OfflinePlayer player, @NotNull final String params) { if (player != null && player.isOnline()) { - return onPlaceholderRequest((Player) player, params); + return onPlaceholderRequest(player.getPlayer(), params); } return onPlaceholderRequest(null, params); From 604fed36a44cc71bd2334b2401fba4bb4d49dce8 Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Sun, 25 Feb 2024 00:14:41 +0100 Subject: [PATCH 27/42] Man, this file is outdated... --- .github/CONTRIBUTING.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 11e2923..9f56021 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,7 +1,7 @@ [issue]: https://github.com/PlaceholderAPI/PlaceholderAPI/issues/new [discord]: https://helpch.at/discord [code of conduct]: https://github.com/PlaceholderAPI/PlaceholderAPI/blob/master/CODE_OF_CONDUCT.md -[wiki]: https://github.com/PlaceholderAPI/PlaceholderAPI/blob/docs/wiki/wiki +[wiki]: https://github.com/PlaceholderAPI/PlaceholderAPI/blob/wiki [master]: https://github.com/PlaceholderAPI/PlaceholderAPI/tree/master [docs-wiki]: https://github.com/PlaceholderAPI/PlaceholderAPI/tree/docs/wiki [style]: https://github.com/PlaceholderAPI/PlaceholderAPI/tree/master/config/style @@ -40,7 +40,8 @@ In those cases should you report the issue to the issue tracker of the expansion ## Pull requests As an open source project are we welcoming all contributions to improve PlaceholderAPI, being it changes to its code, or contributions to its documentation such as the [Wiki] or the Javadocs. -**When contributing, make sure to both base of and target the mentioned branch. Pull requests targeting the wrong branch may get closed without a warning.** +> [!IMPORTANT] +> When contributing, make sure to both base of and target the mentioned branch. Pull requests targeting the wrong branch may get closed without a warning. ### Code contributions > **Source and Target Branch:** [`master`][master] @@ -56,12 +57,10 @@ Javadocs changes should usually be combined with [code contributions](#code-cont \*This branch may change in the future. ### Wiki contributions -> **Source and Target Branch:** [`docs/wiki`][docs-wiki] +> **Source and Target Branch:** [`wiki`][docs-wiki] -The Wiki of PlaceholderAPI has a unique quirk by having a dedicated [`wiki` folder][wiki] hosting the pages found on the actual wiki itself. -If you find outdated information, want to add missing expansions/plugins or just like to correct some wrong spelling should you both base of and target your contributions on the `docs/wiki` branch. - -**Please only PR changes for the `wiki` folder on the `docs/wiki` branch! Pull requests not following this guidelines will be closed unnanounced.** +The Wiki of PlaceholderAPI is located on its own dedicated branch, hosting all the assets and files that get used to create it through the usage of GitHub Actions and GitHub Pages. +We welcome contributions that update outdated information, add new expansions/plugins supporting PlaceholderAPI or even correct spelling mistakes and typos. ## Code of Conduct We have a [Code of Conduct] to maintain a welcoming atmosphere in this project. From e94328935de4adfa1b986807ad8b50bc6156a25e Mon Sep 17 00:00:00 2001 From: Andre601 Date: Sun, 25 Feb 2024 14:42:48 +0100 Subject: [PATCH 28/42] Add Plugin Authors to /papi dump --- .../clip/placeholderapi/commands/impl/local/CommandDump.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandDump.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandDump.java index 6d236d1..2d9ead8 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandDump.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandDump.java @@ -200,7 +200,9 @@ public final class CommandDump extends PlaceholderCommand { for (final Plugin other : plugins) { builder.append(" ") .append(String.format("%-" + size + "s", other.getName())) - .append(" [Version: ") + .append(" [Authors: [") + .append(String.join(", ", other.getDescription().getAuthors())) + .append("], Version: ") .append(other.getDescription().getVersion()) .append("]") .append("\n"); From 068b5a31b2240cc0cc786cce1fd4351695b72c85 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Tue, 30 Apr 2024 23:34:43 +0800 Subject: [PATCH 29/42] Fix #1034 & Deprecate VersionSpecific & update copyright (#1035) Co-authored-by: Andre_601 --- build.gradle.kts | 2 +- config/headers/jsonmessage.txt | 2 +- .../me/clip/placeholderapi/PlaceholderAPI.java | 2 +- .../placeholderapi/PlaceholderAPIPlugin.java | 17 +++++++++++++++-- .../me/clip/placeholderapi/PlaceholderHook.java | 2 +- .../commands/PlaceholderCommand.java | 2 +- .../commands/PlaceholderCommandRouter.java | 2 +- .../commands/impl/cloud/CommandECloud.java | 2 +- .../commands/impl/cloud/CommandECloudClear.java | 2 +- .../impl/cloud/CommandECloudDownload.java | 2 +- .../impl/cloud/CommandECloudExpansionInfo.java | 2 +- .../impl/cloud/CommandECloudExpansionList.java | 2 +- .../CommandECloudExpansionPlaceholders.java | 2 +- .../impl/cloud/CommandECloudRefresh.java | 2 +- .../impl/cloud/CommandECloudStatus.java | 2 +- .../impl/cloud/CommandECloudUpdate.java | 2 +- .../commands/impl/local/CommandDump.java | 2 +- .../impl/local/CommandExpansionRegister.java | 2 +- .../impl/local/CommandExpansionUnregister.java | 2 +- .../commands/impl/local/CommandHelp.java | 2 +- .../commands/impl/local/CommandInfo.java | 2 +- .../commands/impl/local/CommandList.java | 2 +- .../commands/impl/local/CommandParse.java | 2 +- .../commands/impl/local/CommandReload.java | 2 +- .../commands/impl/local/CommandVersion.java | 2 +- .../configuration/ExpansionSort.java | 2 +- .../configuration/PlaceholderAPIConfig.java | 2 +- .../events/ExpansionRegisterEvent.java | 2 +- .../events/ExpansionUnregisterEvent.java | 2 +- .../events/ExpansionsLoadedEvent.java | 2 +- .../events/PlaceholderHookUnloadEvent.java | 2 +- .../exceptions/NoDefaultCommandException.java | 2 +- .../placeholderapi/expansion/Cacheable.java | 2 +- .../placeholderapi/expansion/Cleanable.java | 2 +- .../placeholderapi/expansion/Configurable.java | 2 +- .../placeholderapi/expansion/NMSVersion.java | 2 +- .../expansion/PlaceholderExpansion.java | 2 +- .../placeholderapi/expansion/Relational.java | 2 +- .../clip/placeholderapi/expansion/Taskable.java | 2 +- .../clip/placeholderapi/expansion/Version.java | 3 ++- .../expansion/VersionSpecific.java | 5 ++++- .../expansion/cloud/CloudExpansion.java | 2 +- .../manager/CloudExpansionManager.java | 2 +- .../manager/LocalExpansionManager.java | 2 +- .../expansion/manager/MethodSignature.java | 2 +- .../listeners/ServerLoadEventListener.java | 2 +- .../placeholderapi/replacer/CharsReplacer.java | 2 +- .../clip/placeholderapi/replacer/Replacer.java | 2 +- .../updatechecker/UpdateChecker.java | 2 +- .../me/clip/placeholderapi/util/FileUtil.java | 2 +- .../me/clip/placeholderapi/util/Format.java | 2 +- .../me/clip/placeholderapi/util/Futures.java | 2 +- .../java/me/clip/placeholderapi/util/Msg.java | 2 +- .../me/clip/placeholderapi/util/TimeFormat.java | 2 +- .../me/clip/placeholderapi/util/TimeUtil.java | 2 +- .../java/me/clip/placeholderapi/Values.java | 2 +- .../replacer/ReplacerBenchmarks.java | 2 +- .../replacer/ReplacerUnitTester.java | 2 +- 58 files changed, 76 insertions(+), 59 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1810fa6..56f2ad5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -54,7 +54,7 @@ license { encoding = "UTF-8" ext { - set("year", 2021) + set("year", 2024) } } diff --git a/config/headers/jsonmessage.txt b/config/headers/jsonmessage.txt index 9fddec6..fab9d03 100644 --- a/config/headers/jsonmessage.txt +++ b/config/headers/jsonmessage.txt @@ -1,4 +1,4 @@ -Copyright (c) 2018-2021 Peter Blood +Copyright (c) 2018-2024 Peter Blood Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java b/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java index a5228db..9083184 100644 --- a/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java +++ b/src/main/java/me/clip/placeholderapi/PlaceholderAPI.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java b/src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java index 1fc84bf..8c85e70 100644 --- a/src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java +++ b/src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ package me.clip.placeholderapi; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import me.clip.placeholderapi.commands.PlaceholderCommandRouter; @@ -55,7 +56,18 @@ public final class PlaceholderAPIPlugin extends JavaPlugin { private static PlaceholderAPIPlugin instance; static { - final String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + String version = Bukkit.getServer().getBukkitVersion().split("-")[0]; + String suffix; + if (version.chars() + .filter(c -> c == '.') + .count() == 1) { + suffix = "R1"; + version = 'v' + version.replace('.', '_') + '_' + suffix; + } else { + int minor = Integer.parseInt(version.split("\\.")[2].charAt(0) + ""); + version = 'v' + version.replace('.', '_').replace("_" + minor, "") + '_' + "R" + (minor - 1); + } + boolean isSpigot; try { @@ -127,6 +139,7 @@ public final class PlaceholderAPIPlugin extends JavaPlugin { } } + @Deprecated public static Version getServerVersion() { return VERSION; } diff --git a/src/main/java/me/clip/placeholderapi/PlaceholderHook.java b/src/main/java/me/clip/placeholderapi/PlaceholderHook.java index 9e7478f..9906b8a 100644 --- a/src/main/java/me/clip/placeholderapi/PlaceholderHook.java +++ b/src/main/java/me/clip/placeholderapi/PlaceholderHook.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/PlaceholderCommand.java b/src/main/java/me/clip/placeholderapi/commands/PlaceholderCommand.java index 53d7c8e..8136168 100644 --- a/src/main/java/me/clip/placeholderapi/commands/PlaceholderCommand.java +++ b/src/main/java/me/clip/placeholderapi/commands/PlaceholderCommand.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/PlaceholderCommandRouter.java b/src/main/java/me/clip/placeholderapi/commands/PlaceholderCommandRouter.java index cf6b191..7ea3f42 100644 --- a/src/main/java/me/clip/placeholderapi/commands/PlaceholderCommandRouter.java +++ b/src/main/java/me/clip/placeholderapi/commands/PlaceholderCommandRouter.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloud.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloud.java index 5ebbd70..4d03de1 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloud.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloud.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudClear.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudClear.java index 6d6121c..6083d5d 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudClear.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudClear.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java index 7e30cdc..1085eb8 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudDownload.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionInfo.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionInfo.java index 7e0c5b2..d7b9b97 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionInfo.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionInfo.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java index 9334a73..e5075bb 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionList.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionPlaceholders.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionPlaceholders.java index e1def67..f379365 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionPlaceholders.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudExpansionPlaceholders.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudRefresh.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudRefresh.java index e82b407..c814d9e 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudRefresh.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudRefresh.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudStatus.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudStatus.java index b8e6ab1..b9b7ee6 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudStatus.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudStatus.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudUpdate.java b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudUpdate.java index cdd8233..4aa8454 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudUpdate.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/cloud/CommandECloudUpdate.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandDump.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandDump.java index 2d9ead8..f9d848a 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandDump.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandDump.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionRegister.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionRegister.java index 260f03d..a37d793 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionRegister.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionRegister.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionUnregister.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionUnregister.java index bf0861b..ff6c6da 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionUnregister.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandExpansionUnregister.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandHelp.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandHelp.java index b648f1d..47c1da8 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandHelp.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandHelp.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandInfo.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandInfo.java index 3d98b61..95e84c1 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandInfo.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandInfo.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandList.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandList.java index 6d8506b..0284b89 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandList.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandList.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java index 3793116..8eccc95 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandReload.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandReload.java index ca48275..44e1b43 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandReload.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandReload.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandVersion.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandVersion.java index 0c7a285..f637d9c 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandVersion.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandVersion.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/configuration/ExpansionSort.java b/src/main/java/me/clip/placeholderapi/configuration/ExpansionSort.java index ed4211d..87a795c 100644 --- a/src/main/java/me/clip/placeholderapi/configuration/ExpansionSort.java +++ b/src/main/java/me/clip/placeholderapi/configuration/ExpansionSort.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/configuration/PlaceholderAPIConfig.java b/src/main/java/me/clip/placeholderapi/configuration/PlaceholderAPIConfig.java index 1b355dc..0dc895b 100644 --- a/src/main/java/me/clip/placeholderapi/configuration/PlaceholderAPIConfig.java +++ b/src/main/java/me/clip/placeholderapi/configuration/PlaceholderAPIConfig.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/events/ExpansionRegisterEvent.java b/src/main/java/me/clip/placeholderapi/events/ExpansionRegisterEvent.java index f50ea75..21df3ab 100644 --- a/src/main/java/me/clip/placeholderapi/events/ExpansionRegisterEvent.java +++ b/src/main/java/me/clip/placeholderapi/events/ExpansionRegisterEvent.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/events/ExpansionUnregisterEvent.java b/src/main/java/me/clip/placeholderapi/events/ExpansionUnregisterEvent.java index 0e630d9..e899b60 100644 --- a/src/main/java/me/clip/placeholderapi/events/ExpansionUnregisterEvent.java +++ b/src/main/java/me/clip/placeholderapi/events/ExpansionUnregisterEvent.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/events/ExpansionsLoadedEvent.java b/src/main/java/me/clip/placeholderapi/events/ExpansionsLoadedEvent.java index 56e7ae8..872d275 100644 --- a/src/main/java/me/clip/placeholderapi/events/ExpansionsLoadedEvent.java +++ b/src/main/java/me/clip/placeholderapi/events/ExpansionsLoadedEvent.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/events/PlaceholderHookUnloadEvent.java b/src/main/java/me/clip/placeholderapi/events/PlaceholderHookUnloadEvent.java index 48d2edf..e0a8ce5 100644 --- a/src/main/java/me/clip/placeholderapi/events/PlaceholderHookUnloadEvent.java +++ b/src/main/java/me/clip/placeholderapi/events/PlaceholderHookUnloadEvent.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/exceptions/NoDefaultCommandException.java b/src/main/java/me/clip/placeholderapi/exceptions/NoDefaultCommandException.java index 203c48e..99c9602 100644 --- a/src/main/java/me/clip/placeholderapi/exceptions/NoDefaultCommandException.java +++ b/src/main/java/me/clip/placeholderapi/exceptions/NoDefaultCommandException.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/Cacheable.java b/src/main/java/me/clip/placeholderapi/expansion/Cacheable.java index 0ebc2a8..a12a595 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/Cacheable.java +++ b/src/main/java/me/clip/placeholderapi/expansion/Cacheable.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/Cleanable.java b/src/main/java/me/clip/placeholderapi/expansion/Cleanable.java index 48967f5..ae14598 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/Cleanable.java +++ b/src/main/java/me/clip/placeholderapi/expansion/Cleanable.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/Configurable.java b/src/main/java/me/clip/placeholderapi/expansion/Configurable.java index ad38418..8b2558e 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/Configurable.java +++ b/src/main/java/me/clip/placeholderapi/expansion/Configurable.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java b/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java index c49edfa..8b1ff7b 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java +++ b/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java b/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java index a41be94..3fb24f9 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java +++ b/src/main/java/me/clip/placeholderapi/expansion/PlaceholderExpansion.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/Relational.java b/src/main/java/me/clip/placeholderapi/expansion/Relational.java index 9d39785..4b7c7d4 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/Relational.java +++ b/src/main/java/me/clip/placeholderapi/expansion/Relational.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/Taskable.java b/src/main/java/me/clip/placeholderapi/expansion/Taskable.java index a26b661..b4bea67 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/Taskable.java +++ b/src/main/java/me/clip/placeholderapi/expansion/Taskable.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/Version.java b/src/main/java/me/clip/placeholderapi/expansion/Version.java index 4cbb1ab..d9ac195 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/Version.java +++ b/src/main/java/me/clip/placeholderapi/expansion/Version.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ package me.clip.placeholderapi.expansion; +@Deprecated public final class Version { private final boolean isSpigot; diff --git a/src/main/java/me/clip/placeholderapi/expansion/VersionSpecific.java b/src/main/java/me/clip/placeholderapi/expansion/VersionSpecific.java index 97ddf42..51080cc 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/VersionSpecific.java +++ b/src/main/java/me/clip/placeholderapi/expansion/VersionSpecific.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +27,10 @@ package me.clip.placeholderapi.expansion; * with that version. * * @author Ryan McCarthy + * + * @deprecated Will be removed in a future release. */ +@Deprecated public interface VersionSpecific { /** diff --git a/src/main/java/me/clip/placeholderapi/expansion/cloud/CloudExpansion.java b/src/main/java/me/clip/placeholderapi/expansion/cloud/CloudExpansion.java index cc644d7..f5d158f 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/cloud/CloudExpansion.java +++ b/src/main/java/me/clip/placeholderapi/expansion/cloud/CloudExpansion.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java b/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java index 19dc77c..4f3d1ef 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java +++ b/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java b/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java index 8e6cbd0..1584a5f 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java +++ b/src/main/java/me/clip/placeholderapi/expansion/manager/LocalExpansionManager.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/expansion/manager/MethodSignature.java b/src/main/java/me/clip/placeholderapi/expansion/manager/MethodSignature.java index 87519b1..095c5b5 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/manager/MethodSignature.java +++ b/src/main/java/me/clip/placeholderapi/expansion/manager/MethodSignature.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/listeners/ServerLoadEventListener.java b/src/main/java/me/clip/placeholderapi/listeners/ServerLoadEventListener.java index ca8703d..7fdfba3 100644 --- a/src/main/java/me/clip/placeholderapi/listeners/ServerLoadEventListener.java +++ b/src/main/java/me/clip/placeholderapi/listeners/ServerLoadEventListener.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java b/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java index afa910c..fe08457 100644 --- a/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java +++ b/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/replacer/Replacer.java b/src/main/java/me/clip/placeholderapi/replacer/Replacer.java index b96140a..e0c6e48 100644 --- a/src/main/java/me/clip/placeholderapi/replacer/Replacer.java +++ b/src/main/java/me/clip/placeholderapi/replacer/Replacer.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/updatechecker/UpdateChecker.java b/src/main/java/me/clip/placeholderapi/updatechecker/UpdateChecker.java index 8001d61..ac3b137 100644 --- a/src/main/java/me/clip/placeholderapi/updatechecker/UpdateChecker.java +++ b/src/main/java/me/clip/placeholderapi/updatechecker/UpdateChecker.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/util/FileUtil.java b/src/main/java/me/clip/placeholderapi/util/FileUtil.java index 83c4a1f..5d41c8f 100644 --- a/src/main/java/me/clip/placeholderapi/util/FileUtil.java +++ b/src/main/java/me/clip/placeholderapi/util/FileUtil.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/util/Format.java b/src/main/java/me/clip/placeholderapi/util/Format.java index 0a6bfcf..a149ec5 100644 --- a/src/main/java/me/clip/placeholderapi/util/Format.java +++ b/src/main/java/me/clip/placeholderapi/util/Format.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/util/Futures.java b/src/main/java/me/clip/placeholderapi/util/Futures.java index c29892f..deb0e46 100644 --- a/src/main/java/me/clip/placeholderapi/util/Futures.java +++ b/src/main/java/me/clip/placeholderapi/util/Futures.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/util/Msg.java b/src/main/java/me/clip/placeholderapi/util/Msg.java index 98b9e09..84307c7 100644 --- a/src/main/java/me/clip/placeholderapi/util/Msg.java +++ b/src/main/java/me/clip/placeholderapi/util/Msg.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/util/TimeFormat.java b/src/main/java/me/clip/placeholderapi/util/TimeFormat.java index 29bd2d7..f66f9da 100644 --- a/src/main/java/me/clip/placeholderapi/util/TimeFormat.java +++ b/src/main/java/me/clip/placeholderapi/util/TimeFormat.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/main/java/me/clip/placeholderapi/util/TimeUtil.java b/src/main/java/me/clip/placeholderapi/util/TimeUtil.java index 17c261f..d23a571 100644 --- a/src/main/java/me/clip/placeholderapi/util/TimeUtil.java +++ b/src/main/java/me/clip/placeholderapi/util/TimeUtil.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/test/java/me/clip/placeholderapi/Values.java b/src/test/java/me/clip/placeholderapi/Values.java index 91c91f6..b39ea45 100644 --- a/src/test/java/me/clip/placeholderapi/Values.java +++ b/src/test/java/me/clip/placeholderapi/Values.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/test/java/me/clip/placeholderapi/replacer/ReplacerBenchmarks.java b/src/test/java/me/clip/placeholderapi/replacer/ReplacerBenchmarks.java index a824318..e08de47 100644 --- a/src/test/java/me/clip/placeholderapi/replacer/ReplacerBenchmarks.java +++ b/src/test/java/me/clip/placeholderapi/replacer/ReplacerBenchmarks.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java b/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java index 4924a7e..f0c914f 100644 --- a/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java +++ b/src/test/java/me/clip/placeholderapi/replacer/ReplacerUnitTester.java @@ -2,7 +2,7 @@ * This file is part of PlaceholderAPI * * PlaceholderAPI - * Copyright (c) 2015 - 2021 PlaceholderAPI Team + * Copyright (c) 2015 - 2024 PlaceholderAPI Team * * PlaceholderAPI free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From 68f467ab29a9c1d1d5401f1e687f453997e97e9a Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Tue, 30 Apr 2024 17:35:18 +0200 Subject: [PATCH 30/42] Add 1.20.2 - 1.20.5 to NMSVersion.java (#1057) --- .../java/me/clip/placeholderapi/expansion/NMSVersion.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java b/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java index 8b1ff7b..a730b5d 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java +++ b/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java @@ -47,7 +47,10 @@ public enum NMSVersion { SPIGOT_1_19_R1("v1_19_R1"), SPIGOT_1_19_R2("v1_19_R2"), SPIGOT_1_19_R3("v1_19_R3"), - SPIGOT_1_20_R1("v1_20_R1"); + SPIGOT_1_20_R1("v1_20_R1"), + SPIGOT_1_20_R2("v1_20_R2"), + SPIGOT_1_20_R3("v1_20_R3"), + SPIGOT_1_20_R4("v1_20_R4"); private final String version; From 7b230fc67927bf967ee78ce7f7428bc9cd90b3cf Mon Sep 17 00:00:00 2001 From: Andre601 Date: Mon, 6 May 2024 16:42:24 +0200 Subject: [PATCH 31/42] Fix output for parse command + "me" support in parserel --- .../commands/impl/local/CommandParse.java | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java index 8eccc95..7313f65 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java @@ -87,7 +87,8 @@ public final class CommandParse extends PlaceholderCommand { final boolean command) { if (params.size() < 2) { Msg.msg(sender, - "&cYou must supply a target, and a message: &b/papi " + (broadcast ? "bcparse" : "parse") + "&cYou must provide a target and message: &b/papi " + + (command ? "cmdparse" : (broadcast ? "bcparse" : "parse")) + " &7{target} &a{message}"); return; } @@ -132,24 +133,49 @@ public final class CommandParse extends PlaceholderCommand { @NotNull @Unmodifiable final List params) { if (params.size() < 3) { Msg.msg(sender, - "&cYou must supply two targets, and a message: &b/papi parserel &7{target one} {target two} &a{message}"); + "&cYou must supply two targets, and a message: &b/papi parserel &7{target one} " + + "{target two} &a{message}"); return; } - - final OfflinePlayer targetOne = resolvePlayer(params.get(0)); - if (targetOne == null || !targetOne.isOnline()) { + + OfflinePlayer playerOne; + + if ("me".equalsIgnoreCase(params.get(0))) { + if (!(sender instanceof Player)) { + Msg.msg(sender, "&cYou must be a player to use &7me&c as a target!"); + return; + } + + playerOne = ((Player) sender); + } else { + playerOne = resolvePlayer(params.get(0)); + } + + if (playerOne == null || !playerOne.isOnline()) { Msg.msg(sender, "&cFailed to find player: &f" + params.get(0)); return; } - - final OfflinePlayer targetTwo = resolvePlayer(params.get(1)); - if (targetTwo == null || !targetTwo.isOnline()) { + + OfflinePlayer playerTwo; + + if ("me".equalsIgnoreCase(params.get(1))) { + if (!(sender instanceof Player)) { + Msg.msg(sender, "&cYou must be a player to use &7me&c as a target!"); + return; + } + + playerTwo = ((Player) sender); + } else { + playerTwo = resolvePlayer(params.get(1)); + } + + if (playerTwo == null || !playerTwo.isOnline()) { Msg.msg(sender, "&cFailed to find player: &f" + params.get(1)); return; } final String message = PlaceholderAPI - .setRelationalPlaceholders(((Player) targetOne), ((Player) targetTwo), + .setRelationalPlaceholders(playerOne.getPlayer(), playerTwo.getPlayer(), String.join(" ", params.subList(2, params.size()))); sender.sendMessage(message); From 2523b6c0947d97c1386182014837788a606bfd75 Mon Sep 17 00:00:00 2001 From: Andre601 Date: Fri, 10 May 2024 14:41:51 +0200 Subject: [PATCH 32/42] Update Adventure-platform-bukkit to 4.3.2 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 56f2ad5..ab0c49d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,7 @@ repositories { dependencies { implementation("org.bstats:bstats-bukkit:3.0.1") - implementation("net.kyori:adventure-platform-bukkit:4.3.1") + implementation("net.kyori:adventure-platform-bukkit:4.3.2") compileOnly("org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") compileOnlyApi("org.jetbrains:annotations:23.0.0") From d5e96bd6a60e006f4ac08c8e46d1ecc36397aff9 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Mon, 20 May 2024 22:44:44 +0800 Subject: [PATCH 33/42] exclude module-info fix #894 --- build.gradle.kts | 2 ++ src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 56f2ad5..a1d11a5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -88,6 +88,8 @@ tasks { relocate("org.bstats", "me.clip.placeholderapi.metrics") relocate("net.kyori", "me.clip.placeholderapi.libs.kyori") + + exclude("META-INF/versions/**") } test { diff --git a/src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java b/src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java index 8c85e70..e4af6e0 100644 --- a/src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java +++ b/src/main/java/me/clip/placeholderapi/PlaceholderAPIPlugin.java @@ -68,7 +68,6 @@ public final class PlaceholderAPIPlugin extends JavaPlugin { version = 'v' + version.replace('.', '_').replace("_" + minor, "") + '_' + "R" + (minor - 1); } - boolean isSpigot; try { Class.forName("org.spigotmc.SpigotConfig"); From a35923a117f45a2c5f19de68a02cf10526e8ad94 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Tue, 21 May 2024 17:59:57 +0800 Subject: [PATCH 34/42] cast instead of #getplayer --- .../clip/placeholderapi/commands/impl/local/CommandParse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java index 7313f65..1ff59b9 100644 --- a/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java +++ b/src/main/java/me/clip/placeholderapi/commands/impl/local/CommandParse.java @@ -175,7 +175,7 @@ public final class CommandParse extends PlaceholderCommand { } final String message = PlaceholderAPI - .setRelationalPlaceholders(playerOne.getPlayer(), playerTwo.getPlayer(), + .setRelationalPlaceholders((Player) playerOne, (Player) playerTwo, String.join(" ", params.subList(2, params.size()))); sender.sendMessage(message); From 8b031576aa4ce768ab22c6972a82713516bcff25 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Tue, 21 May 2024 18:31:02 +0800 Subject: [PATCH 35/42] bump version for release --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index a0f23c7..9d6a45b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "me.clip" -version = "2.11.6-DEV-${System.getProperty("BUILD_NUMBER")}" +version = "2.11.6" description = "An awesome placeholder provider!" From ac771207c3247fda4a92f617ffe3db7ede1c30ac Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Tue, 21 May 2024 18:51:05 +0800 Subject: [PATCH 36/42] bump to dev version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9d6a45b..7f5e7c9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "me.clip" -version = "2.11.6" +version = "2.11.7-DEV-${System.getProperty("BUILD_NUMBER")}" description = "An awesome placeholder provider!" From 907ced6d7df8fb59a3a4aa2960c758be836ed9fe Mon Sep 17 00:00:00 2001 From: Glare Date: Thu, 13 Jun 2024 18:08:58 -0500 Subject: [PATCH 37/42] feat: initial work on 1.21 --- build.gradle.kts | 6 +++--- .../java/me/clip/placeholderapi/expansion/NMSVersion.java | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 7f5e7c9..3e0b662 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { `java-library` `maven-publish` id("com.github.hierynomus.license") version "0.16.1" - id("com.github.johnrengelman.shadow") version "8.1.0" + id("com.github.johnrengelman.shadow") version "8.1.1" } group = "me.clip" @@ -24,9 +24,9 @@ repositories { dependencies { implementation("org.bstats:bstats-bukkit:3.0.1") - implementation("net.kyori:adventure-platform-bukkit:4.3.2") + implementation("net.kyori:adventure-platform-bukkit:4.3.3") - compileOnly("org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT") + compileOnly("org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT") compileOnlyApi("org.jetbrains:annotations:23.0.0") testImplementation("org.openjdk.jmh:jmh-core:1.32") diff --git a/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java b/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java index a730b5d..a9a8940 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java +++ b/src/main/java/me/clip/placeholderapi/expansion/NMSVersion.java @@ -50,7 +50,8 @@ public enum NMSVersion { SPIGOT_1_20_R1("v1_20_R1"), SPIGOT_1_20_R2("v1_20_R2"), SPIGOT_1_20_R3("v1_20_R3"), - SPIGOT_1_20_R4("v1_20_R4"); + SPIGOT_1_20_R4("v1_20_R4"), + SPIGOT_1_21_R1("v1_21_R1"); private final String version; From c1487898a968f7ebc2c00431f39722b7c3a4502c Mon Sep 17 00:00:00 2001 From: Glare Date: Fri, 14 Jun 2024 10:07:06 -0500 Subject: [PATCH 38/42] chore(deps): update gradle + shadow fork --- build.gradle.kts | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 61608 bytes gradle/wrapper/gradle-wrapper.properties | 3 ++- gradlew | 28 +++++++++++++++-------- gradlew.bat | 15 +++++++----- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3e0b662..94acc75 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { `java-library` `maven-publish` id("com.github.hierynomus.license") version "0.16.1" - id("com.github.johnrengelman.shadow") version "8.1.1" + id("io.github.goooler.shadow") version "8.1.7" } group = "me.clip" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..ccebba7710deaf9f98673a68957ea02138b60d0a 100644 GIT binary patch delta 39624 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 delta 37640 zcmY(pV{oQl@UEMQIdLYoZQHhO+nPMFZN0H=PmGB*$wZUnjWaPO#`&H7-?h&^-+I;R zs`a5)RbSorT?K|pUW9^CRe*v?z)jk`3-v@h+Kh<+Z{*45LEsZ32p!?75|!v%;9<=FBo{3 zRXe7ZM! z98qkC_kq3Jr|u(PUJ~iwCsJ*p-a(%Pqgj9Xc7Lc+p}K;6c)u(#FRF9=)wo4iY?p4? z60^8uurIVZQIm2}Ce`pi{UcuL|JWR#Q8Q{kW;nuMAGNtQh~oc6&3J6c<$o3S|5VZL z3u7$_36WS~;2Z71buHB@aK)V3L^u?)d zgL#sy&e{9ax^%(*s{V)IV@T%*!UNSBd;4;hcLk8Pe=pE0CuiO_IJ4fm^Y77!=TrFo zoh`WZNlqF9lihd(2H~4Tb~-DS1^(64wO9r#g_*WAa+amxcmVrRGJrkN7mtQxX*i_i z)<+_)tlALaYBUUoq0Ua;MP@iVh_L|~D(37j(?wz? zH)m`19Dj#1&V*2`b2-ZiEQ!yJt#^vxxg*64X#g`#J%-t-v$plgb=PvP(#c)s>9y7b zia~oDB#rs6W!COA<7^EAUGZ+oDkF@MMA#i>xh|YHyh}y{7$8zNEO<5xxxiDLg$P4b-Y1$G*5>uV zUS3pq1J;l+0lZpsti6iEQIx5uk^MRLBoj{ttVWACl|oS5nKj68VY0Gc7aeC$BJ8jj zOJY7VO(CumzCL^t5jhn@iNu|q84KnD=<_A zdu!zT6mz@J)LDflk;4=e9Y)D6N1$>&y?&_rrn(jkV6v+KV*+;gTjsyS5vg@l(vR3b zWJ+XMkIxyWiTvfj0A>dq5_)wLTyc&a<+vLiN^(sxvcN#kdN14v*xh#Mq8y&vfu!{* z6*7&MY+F>Q3qUL5H~;=>yDT2XY_CY`)P)3FFwH2X>`1n_*;bC{o$+g>X%?nvM%-jh z{Su%6)DM)s>(8&%@BC#c4QMzLh#-smk-I+w3c6 zvKP8e?Wjtrs`6uFL54F}HGH*3xYgPqw0cYfyc3EwSa=vazJ~dV>jie^&gSULF$&&* z9()2Rpu znE8a?Ed8MOFZsAmq#w2ju_f(GE2H2u@zv>w{bMm?o9u@pbMk$DrRtOAzCj}K1&~M= z3x4P=(l{yeU=jNh_4U5EFo-vvA`w}tQT>g_4UH=Hhxpp zUz@=oXPTamj%0)trn)RGmcHmFJ|vYE1EQUS0VzJdJQbE??HpA%$|iGf*ShFur0~

hZ6yjbL-Opwj#IyQ(UF?vIf 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 H_^bZ|3zHqB diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e1bef7e..2617362 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index c53aefa..79a61d4 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions $var, ${var}, ${var:-default}, ${var+SET}, -# ${var#prefix}, ${var%suffix}, and $( cmd ); -# * compound commands having a testable exit status, especially case; -# * various built-in commands including command, set, and ulimit. +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From c97f5aa5a67d5c971df275869c658121247998d9 Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Tue, 18 Jun 2024 22:45:15 +0200 Subject: [PATCH 39/42] Bump download stats --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 549700d..410522a 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Support for specific plugins are provided either by the plugin itself or through expansions. The expansions may be downloaded in-game through the PAPI Expansion Cloud. There are currently over 240+ expansions that support a wide variety of plugins, such as Essentials, Factions, LuckPerms, and Vault. -PlaceholderAPI has been downloaded over 1,000,000 times and has been used concurrently on over 40,000 servers, which makes it a must-have for a server of any type or scale. +PlaceholderAPI has been downloaded over 1,600,000 times and has been used concurrently on over 40,000 servers, which makes it a must-have for a server of any type or scale. ## Contribute If you would like to contribute towards PlaceholderAPI should you take a look at our [Contributing file][contributing] for the ins and outs on how you can do that and what you need to keep in mind. From 98082398fc4c65a00112f807e0ab1e4da249605e Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Thu, 4 Jul 2024 17:46:04 +0800 Subject: [PATCH 40/42] Target java release 8 for compilation --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index 94acc75..a26bb6d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -71,6 +71,7 @@ tasks { withType { options.encoding = "UTF-8" + options.release = 8 } withType { From 0a712e6530ce7378e4aabe6d61d07db2148596f9 Mon Sep 17 00:00:00 2001 From: Andre_601 Date: Wed, 13 Nov 2024 14:40:41 +0100 Subject: [PATCH 41/42] Fix API version badge + update flex --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 410522a..eb6da43 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ [ci]: http://ci.extendedclip.com/job/PlaceholderAPI/ [ciImg]: http://ci.extendedclip.com/buildStatus/icon?job=PlaceholderAPI -[APIversionImg]: https://img.shields.io/nexus/placeholderapi/me.clip/placeholderapi?server=https%3A%2F%2Frepo.extendedclip.com&label=API%20Version +[APIversionImg]: https://repo.extendedclip.com/api/badge/latest/releases/me/clip/placeholderapi?name=API%20Version [logo]: https://wiki.placeholderapi.com/assets/img/papi-logo.png [contributing]: https://github.com/PlaceholderAPI/PlaceholderAPI/blob/master/.github/CONTRIBUTING.md @@ -32,7 +32,7 @@ Support for specific plugins are provided either by the plugin itself or through expansions. The expansions may be downloaded in-game through the PAPI Expansion Cloud. There are currently over 240+ expansions that support a wide variety of plugins, such as Essentials, Factions, LuckPerms, and Vault. -PlaceholderAPI has been downloaded over 1,600,000 times and has been used concurrently on over 40,000 servers, which makes it a must-have for a server of any type or scale. +PlaceholderAPI has been downloaded over 1,700,000 times on Spigot and has been used concurrently on over 45,000 servers, which makes it a must-have for a server of any type or scale. ## Contribute If you would like to contribute towards PlaceholderAPI should you take a look at our [Contributing file][contributing] for the ins and outs on how you can do that and what you need to keep in mind. From b838d1c52a6aef65f483c4fdb207324acbfbdae5 Mon Sep 17 00:00:00 2001 From: PiggyPiglet Date: Wed, 27 Nov 2024 19:58:05 +0800 Subject: [PATCH 42/42] Update ecloud api link --- README.md | 2 +- .../placeholderapi/expansion/manager/CloudExpansionManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eb6da43..99868d9 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [spigot]: https://www.spigotmc.org/resources/6245/ [hangar]: https://hangar.papermc.io/HelpChat/PlaceholderAPI [bbb]: https://builtbybit.com/resources/placeholderapi.24306 -[Expansions cloud]: https://api.extendedclip.com/home +[Expansions cloud]: https://api.placeholderapi.net/home [placeholder list]: https://helpch.at/placeholders [statistics]: https://bstats.org/plugin/bukkit/PlaceholderAPI diff --git a/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java b/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java index 4f3d1ef..ed152b7 100644 --- a/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java +++ b/src/main/java/me/clip/placeholderapi/expansion/manager/CloudExpansionManager.java @@ -60,7 +60,7 @@ import org.jetbrains.annotations.Unmodifiable; public final class CloudExpansionManager { @NotNull - private static final String API_URL = "http://api.extendedclip.com/v2/"; + private static final String API_URL = "http://api.placeholderapi.net/v2/"; @NotNull private static final Gson GSON = new Gson();