From 6433a798576a88d52cfa1a23c53fce152662665f Mon Sep 17 00:00:00 2001 From: carme Date: Sun, 2 Jun 2024 03:02:15 +0200 Subject: [PATCH] update to 1.20.4 --- pom.xml | 10 +-- .../expansion/mcstatistics/ServerVersion.java | 53 ----------- .../mcstatistics/StatisticsExpansion.java | 16 ++-- .../mcstatistics/StatisticsUtils.java | 84 ++---------------- target/PAPI-Expansion-Statistic.jar | Bin 11970 -> 0 bytes 5 files changed, 19 insertions(+), 144 deletions(-) delete mode 100644 src/main/java/com/extendedclip/papi/expansion/mcstatistics/ServerVersion.java delete mode 100644 target/PAPI-Expansion-Statistic.jar diff --git a/pom.xml b/pom.xml index a66f4dc..572d6c5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.extendedclip.papi.expansion.mcstatistics statistics-expansion 2.0.1 - PAPI-Expansion-Statistic + Expansion-statistic PlaceholderAPI expansion for minecraft statistic placeholders @@ -23,13 +23,13 @@ org.spigotmc spigot-api - 1.15.2-R0.1-SNAPSHOT + 1.20.4-R0.1-SNAPSHOT provided me.clip placeholderapi - 2.10.8-DEV-86 + 2.11.6 provided @@ -55,8 +55,8 @@ maven-compiler-plugin 3.2 - 1.8 - 1.8 + 17 + 17 UTF-8 false diff --git a/src/main/java/com/extendedclip/papi/expansion/mcstatistics/ServerVersion.java b/src/main/java/com/extendedclip/papi/expansion/mcstatistics/ServerVersion.java deleted file mode 100644 index 6ea2113..0000000 --- a/src/main/java/com/extendedclip/papi/expansion/mcstatistics/ServerVersion.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.extendedclip.papi.expansion.mcstatistics; - -import com.google.common.primitives.Ints; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.Statistic; -import org.bukkit.entity.EntityType; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Class for detecting server version for legacy support :( - * @author Matt - */ -public final class ServerVersion { - - private static final int CURRENT_VERSION = getCurrentVersion(); - private static final int LATEST_VERSION = 1_19_2; - - public static final String AS_STRING = Bukkit.getBukkitVersion().split("-")[0]; - - public static final boolean IS_LEGACY = CURRENT_VERSION < 1_13_0; - /** - * {@link org.bukkit.OfflinePlayer#getStatistic(Statistic)} was added in 1.15 - * @see org.bukkit.OfflinePlayer#getStatistic(Statistic, Material) - * @see org.bukkit.OfflinePlayer#getStatistic(Statistic, EntityType) - */ - public static final boolean SUPPORT_OFFLINE_PLAYERS = CURRENT_VERSION >= 1_15_0; - public static final boolean IS_LATEST = CURRENT_VERSION >= LATEST_VERSION; - - private static int getCurrentVersion() { - // No need to cache since will only run once - final Matcher matcher = Pattern.compile("(?\\d+\\.\\d+)(?\\.\\d+)?").matcher(AS_STRING); - - final StringBuilder stringBuilder = new StringBuilder(); - if (matcher.find()) { - stringBuilder.append(matcher.group("version").replace(".", "")); - final String patch = matcher.group("patch"); - if (patch == null) stringBuilder.append("0"); - else stringBuilder.append(patch.replace(".", "")); - } - - //noinspection UnstableApiUsage - final Integer version = Ints.tryParse(stringBuilder.toString()); - - // Should never fail - if (version == null) throw new IllegalArgumentException("Could not retrieve server version!"); - - return version; - } - -} diff --git a/src/main/java/com/extendedclip/papi/expansion/mcstatistics/StatisticsExpansion.java b/src/main/java/com/extendedclip/papi/expansion/mcstatistics/StatisticsExpansion.java index db65de4..ea12f62 100644 --- a/src/main/java/com/extendedclip/papi/expansion/mcstatistics/StatisticsExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/mcstatistics/StatisticsExpansion.java @@ -64,10 +64,6 @@ public String onRequest(OfflinePlayer player, String identifier) { return ""; } - if (!ServerVersion.SUPPORT_OFFLINE_PLAYERS && !player.isOnline()) { - return ""; - } - switch (identifier.toLowerCase()) { case "mine_block": { return calculateTotal(player, Statistic.MINE_BLOCK); @@ -161,7 +157,7 @@ public String onRequest(OfflinePlayer player, String identifier) { final Optional statisticOptional = Enums.getIfPresent(Statistic.class, statisticIdentifier); if (!statisticOptional.isPresent()) { - return "Unknown statistic '" + statisticIdentifier + "', check " + StatisticsUtils.JAVADOC_BASE_LINK + "/org/bukkit/Statistic.html for more info"; + return "Unknown statistic '" + statisticIdentifier; } final Statistic statistic = statisticOptional.get(); @@ -178,7 +174,7 @@ public String onRequest(OfflinePlayer player, String identifier) { } try { - return Integer.toString(ServerVersion.SUPPORT_OFFLINE_PLAYERS ? player.getStatistic(statistic, material.get()) : player.getPlayer().getStatistic(statistic, material.get())); + return Integer.toString(player.getStatistic(statistic, material.get())); } catch (IllegalArgumentException e) { errorLog("Could not get the statistic '" + statistic.name() + "' for '" + material.get().name() + "'", e); return "Could not get the statistic '" + statistic.name() + "' for '" + material.get().name() + "'"; @@ -193,7 +189,7 @@ public String onRequest(OfflinePlayer player, String identifier) { } try { - return Integer.toString(ServerVersion.SUPPORT_OFFLINE_PLAYERS ? player.getStatistic(statistic, entityType.get()) : player.getPlayer().getStatistic(statistic, entityType.get())); + return Integer.toString(player.getStatistic(statistic, entityType.get())); } catch (IllegalArgumentException e) { errorLog("Could not get the statistic '" + statistic.name() + "' for '" + entityType.get().name() + "'", e); return "Could not get the statistic '" + statistic.name() + "' for '" + entityType.get().name() + "'"; @@ -220,7 +216,7 @@ public String onRequest(OfflinePlayer player, String identifier) { } try { - total.addAndGet(ServerVersion.SUPPORT_OFFLINE_PLAYERS ? player.getStatistic(statistic, material.get()) : player.getPlayer().getStatistic(statistic, material.get())); + total.addAndGet(player.getStatistic(statistic, material.get())); } catch (IllegalArgumentException e) { errorLog("Could not get the statistic '" + statistic.name() + "' for '" + material.get().name() + "'", e); break; @@ -239,7 +235,7 @@ public String onRequest(OfflinePlayer player, String identifier) { } try { - total.addAndGet(ServerVersion.SUPPORT_OFFLINE_PLAYERS ? player.getStatistic(statistic, entityType.get()) : player.getPlayer().getStatistic(statistic, entityType.get())); + total.addAndGet(player.getStatistic(statistic, entityType.get())); } catch (IllegalArgumentException e) { errorLog("Could not get the statistic '" + statistic.name() + "' for '" + entityType.get().name() + "'", e); break; @@ -269,7 +265,7 @@ private String calculateTotal(final OfflinePlayer player, final Statistic statis } try { - total.addAndGet(ServerVersion.SUPPORT_OFFLINE_PLAYERS ? player.getStatistic(statistic, material) : player.getPlayer().getStatistic(statistic, material)); + total.addAndGet(player.getStatistic(statistic, material)); } catch (IllegalArgumentException ignored) { ignoredMaterials.put(statistic, material); } diff --git a/src/main/java/com/extendedclip/papi/expansion/mcstatistics/StatisticsUtils.java b/src/main/java/com/extendedclip/papi/expansion/mcstatistics/StatisticsUtils.java index b4a4f8a..3225f0f 100644 --- a/src/main/java/com/extendedclip/papi/expansion/mcstatistics/StatisticsUtils.java +++ b/src/main/java/com/extendedclip/papi/expansion/mcstatistics/StatisticsUtils.java @@ -30,105 +30,37 @@ public class StatisticsUtils { - private static final Statistic SECONDS_PLAYED_STATISTIC = ServerVersion.IS_LEGACY ? Statistic.valueOf("PLAY_ONE_TICK") : Statistic.PLAY_ONE_MINUTE; - private static final Statistic SECONDS_SINCE_LAST_DEATH_STATISTIC = ServerVersion.IS_LEGACY ? Statistic.valueOf("TIME_SINCE_DEATH") : Statistic.TIME_SINCE_DEATH; + private static final Statistic SECONDS_PLAYED_STATISTIC = Statistic.PLAY_ONE_MINUTE; + private static final Statistic SECONDS_SINCE_LAST_DEATH_STATISTIC = Statistic.TIME_SINCE_DEATH; - public static final String JAVADOC_BASE_LINK = ServerVersion.IS_LATEST ? "https://hub.spigotmc.org/javadocs/spigot" : "https://docs.docdex.helpch.at/" + ServerVersion.AS_STRING; + //public static final String JAVADOC_BASE_LINK = ServerVersion.IS_LATEST ? "https://hub.spigotmc.org/javadocs/spigot" : "https://docs.docdex.helpch.at/" + ServerVersion.AS_STRING; public static int getSecondsPlayed(final OfflinePlayer player) { - return (ServerVersion.SUPPORT_OFFLINE_PLAYERS ? player.getStatistic(SECONDS_PLAYED_STATISTIC) : player.getPlayer().getStatistic(SECONDS_PLAYED_STATISTIC)) / 20; + return player.getStatistic(SECONDS_PLAYED_STATISTIC) / 20; } public static int getSecondsSinceLastDeath(final OfflinePlayer player) { - return (ServerVersion.SUPPORT_OFFLINE_PLAYERS ? player.getStatistic(SECONDS_SINCE_LAST_DEATH_STATISTIC) : player.getPlayer().getStatistic(SECONDS_SINCE_LAST_DEATH_STATISTIC)) / 20; + return player.getStatistic(SECONDS_SINCE_LAST_DEATH_STATISTIC) / 20; } @SuppressWarnings("Guava") public static String getStatistic(final OfflinePlayer player, final String identifier) { final Optional optional = Enums.getIfPresent(Statistic.class, identifier.toUpperCase()); - if(!ServerVersion.SUPPORT_OFFLINE_PLAYERS && !player.isOnline()) { - return "Cannot get statistic, player is offline"; - } - if (!optional.isPresent()) { - return "Unknown statistic '" + identifier + "', check " + JAVADOC_BASE_LINK + "/org/bukkit/Statistic.html for more info"; + return "Unknown statistic '" + identifier; } final Statistic statistic = optional.get(); if (statistic.getType() != Statistic.Type.UNTYPED) { - return "The statistic '" + identifier + "' require an argument, check " + JAVADOC_BASE_LINK + "/org/bukkit/Statistic.Type.html for more info" ; + return "The statistic '" + identifier + "' require an argument"; } - int value = ServerVersion.SUPPORT_OFFLINE_PLAYERS ? player.getStatistic(statistic) : player.getPlayer().getStatistic(statistic); + int value = player.getStatistic(statistic) ; return Integer.toString(value); } - public static boolean isItem(final Material material, final boolean isLegacy) { - if (isLegacy) { - switch (material.name()) { - case "ACACIA_DOOR": - case "BED_BLOCK": - case "BEETROOT_BLOCK": - case "BIRCH_DOOR": - case "BREWING_STAND": - case "BURNING_FURNACE": - case "CAKE_BLOCK": - case "CARROT": - case "CAULDRON": - case "COCOA": - case "CROPS": - case "DARK_OAK_DOOR": - case "DAYLIGHT_DETECTOR_INVERTED": - case "DIODE_BLOCK_OFF": - case "DIODE_BLOCK_ON": - case "DOUBLE_STEP": - case "DOUBLE_STONE_SLAB2": - case "ENDER_PORTAL": - case "END_GATEWAY": - case "FIRE": - case "FLOWER_POT": - case "FROSTED_ICE": - case "GLOWING_REDSTONE_ORE": - case "IRON_DOOR_BLOCK": - case "JUNGLE_DOOR": - case "LAVA": - case "MELON_STEM": - case "NETHER_WARTS": - case "PISTON_EXTENSION": - case "PISTON_MOVING_PIECE": - case "PORTAL": - case "POTATO": - case "PUMPKIN_STEM": - case "PURPUR_DOUBLE_SLAB": - case "REDSTONE_COMPARATOR_OFF": - case "REDSTONE_COMPARATOR_ON": - case "REDSTONE_LAMP_ON": - case "REDSTONE_TORCH_OFF": - case "REDSTONE_WIRE": - case "SIGN_POST": - case "SKULL": - case "SPRUCE_DOOR": - case "STANDING_BANNER": - case "STATIONARY_LAVA": - case "STATIONARY_WATER": - case "SUGAR_CANE_BLOCK": - case "TRIPWIRE": - case "WALL_BANNER": - case "WALL_SIGN": - case "WATER": - case "WOODEN_DOOR": - case "WOOD_DOUBLE_STEP": - return false; - default: - return true; - } - } else { - return material.isItem(); - } - } - /** * @author Sxtanna */ diff --git a/target/PAPI-Expansion-Statistic.jar b/target/PAPI-Expansion-Statistic.jar deleted file mode 100644 index a2a0a3dcbcbc2f8521ab138de54b994b6ab08133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11970 zcmcI~19)c3vUZY*ZDTUAt%>bSII(Rznb@{%+qP}n&P+JLpE(<|&)IvQ=iYn%)8F&0 z^`WZX>gw)VwR*kM;_rYV0e-Z1g^AMt`0(oi;_WOcD9=kJDkVfC{i_%_0MMIQ*E95f z)7#%FfB*oKoO@y#~op@J5us+QT%qH9%*apreSy6_p zhjNc6wL%QTun1TV;K!NUxz{Xqo=WxTurlAHR_`cC08?xs6#HJjbgbc&CzYX8YX^|u zy87pc0Kaur*V6p=VEkDE;a3TLCp&!$J$*f0Gh?fNBaZr4;#S&L#{Wj={om^7J6UO4 z*cw|}{2Ohm|ADr-uC1N6ow2Q*v99g!rojI(Kk(g=)j)s%0A$|*0Eql=P09UkRq!`Y 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