From 81f5e8a846cf6ca3e9fb5d95c9d97b43ae3df453 Mon Sep 17 00:00:00 2001 From: RobinDeBaets Date: Sat, 12 Dec 2020 13:29:02 +0100 Subject: [PATCH 01/17] Fixes #40 --- .../extendedclip/papi/expansion/player/PlayerExpansion.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 216af82..47b4ed1 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -312,9 +312,9 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi case "ticks_lived": return String.valueOf(p.getTicksLived()); case "seconds_lived": - return String.valueOf(p.getTicksLived() * 20); + return String.valueOf(p.getTicksLived() / 20); case "minutes_lived": - return String.valueOf((p.getTicksLived() * 20) / 60); + return String.valueOf((p.getTicksLived() / 20) / 60); case "walk_speed": return String.valueOf(p.getWalkSpeed()); case "weather_duration": From 73cc29bc13bcf4e2110a286b958fe71a463bbefa Mon Sep 17 00:00:00 2001 From: darbyjack Date: Sun, 28 Mar 2021 13:55:33 -0500 Subject: [PATCH 02/17] Manually set the expansion version --- .../extendedclip/papi/expansion/player/PlayerExpansion.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 216af82..a21b223 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -49,9 +49,6 @@ import static com.extendedclip.papi.expansion.player.PlayerUtil.getXZDirection; import static com.extendedclip.papi.expansion.player.PlayerUtil.itemInHand; public final class PlayerExpansion extends PlaceholderExpansion implements Configurable { - - private final String VERSION = getClass().getPackage().getImplementationVersion(); - private String low; private String medium; private String high; @@ -68,7 +65,7 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi @Override public String getVersion() { - return VERSION; + return "1.8.0"; } @Override From d249df9ba2c950ed410b64a31e7d4d6717d821d8 Mon Sep 17 00:00:00 2001 From: AliveSteve <59321467+DeadSteve51@users.noreply.github.com> Date: Sun, 28 Mar 2021 21:29:10 -0400 Subject: [PATCH 03/17] Add new Placeholder block_underneath block_underneath will return the block the player that is directly underneath the player. May add one in later update that adds an extra placeholder that will not return blocks like lava, air. water, etc. --- .../extendedclip/papi/expansion/player/PlayerExpansion.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index a21b223..88bfd27 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -32,6 +32,7 @@ import org.bukkit.World; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; +import org.bukkit.Location; import java.util.Date; import java.util.HashMap; @@ -228,6 +229,9 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return p.getCompassTarget() != null ? String.valueOf(p.getCompassTarget().getBlockZ()) : ""; case "compass_world": return p.getCompassTarget() != null ? p.getCompassTarget().getWorld().getName() : ""; + case "block_underneath": + Location loc = Objects.requireNonNull(player.getPlayer()).getLocation().clone().subtract(0, 1, 0); + return String.valueOf(loc.getBlock().getType()); case "custom_name": return p.getCustomName() != null ? p.getCustomName() : p.getName(); case "exp": From bb3c3d1263f1ed87ec73f18edf8fdb3b9dcf65a9 Mon Sep 17 00:00:00 2001 From: Maxim Van de Wynckel Date: Wed, 9 Jun 2021 14:42:52 +0200 Subject: [PATCH 04/17] feat: added extra locale placeholders and online player flags for common actions --- .../expansion/player/PlayerExpansion.java | 51 +++++++- .../papi/expansion/player/PlayerUtil.java | 112 +++++++++++------- 2 files changed, 116 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index a21b223..cec9c55 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -33,10 +33,7 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; import static com.extendedclip.papi.expansion.player.PlayerUtil.format12; import static com.extendedclip.papi.expansion.player.PlayerUtil.format24; @@ -128,6 +125,7 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi case "bed_world": return player.getBedSpawnLocation() != null ? player.getBedSpawnLocation().getWorld() .getName() : ""; + } // online placeholders @@ -168,6 +166,33 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return "0"; } + if (identifier.startsWith("locale")) { + String localeStr = PlayerUtil.getLocale(p); + String localeStrISO = localeStr.replace("_", "-"); + + switch (identifier) { + case "locale": + return localeStr; + case "locale_country": + Locale locale = Locale.forLanguageTag(localeStrISO); + if (locale == null) + return ""; + return locale.getCountry(); + case "locale_display_country": + locale = Locale.forLanguageTag(localeStrISO); + if (locale == null) + return ""; + return locale.getDisplayCountry(); + case "locale_display_name": + locale = Locale.forLanguageTag(localeStrISO); + if (locale == null) + return ""; + return locale.getDisplayName(); + case "locale_short": + return localeStr.substring(0, localeStr.indexOf("_")); + } + } + switch (identifier) { case "has_empty_slot": return bool(p.getInventory().firstEmpty() > -1); @@ -178,8 +203,6 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return "now available in the server expansion"; case "displayname": return p.getDisplayName(); - case "locale": - return p.getLocale(); case "gamemode": return p.getGameMode().name(); case "direction": @@ -322,6 +345,22 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return format12(p.getWorld().getTime()); case "world_time_24": return format24(p.getWorld().getTime()); + case "is_flying": + return bool(p.isFlying()); + case "is_sleeping": + return bool(p.isSleeping()); + case "is_conversing": + return bool(p.isConversing()); + case "is_dead": + return bool(p.isDead()); + case "is_sneaking": + return bool(p.isSneaking()); + case "is_sprinting": + return bool(p.isSprinting()); + case "is_leashed": + return bool(p.isLeashed()); + case "is_inside_vehicle": + return bool(p.isInsideVehicle()); } // return null for unknown placeholders return null; diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java index a37e2c2..9c19f1e 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java @@ -43,57 +43,87 @@ public final class PlayerUtil { private static final SimpleDateFormat twentyFour = new SimpleDateFormat("HH:mm", Locale.ENGLISH); private static final SimpleDateFormat twelve = new SimpleDateFormat("h:mm aa", Locale.ENGLISH); - private PlayerUtil() - {} + private PlayerUtil() { + } - private static final Function PLAYER_GET_PING = new Function() { + private static final Function PLAYER_GET_PING = new Function() { - private Field ping; - private Method getHandle; + private Field ping; + private Method getHandle; - @Override - public Integer apply(final Player player) - { - if (ping == null) - { - try - { - cacheReflection(player); - } - catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException | NoSuchFieldException ex) - { - ex.printStackTrace(); - } - } + @Override + public Integer apply(final Player player) { + if (ping == null) { + try { + cacheReflection(player); + } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException | NoSuchFieldException ex) { + ex.printStackTrace(); + } + } - try - { - return ping.getInt(getHandle.invoke(player)); - } - catch (final IllegalAccessException | InvocationTargetException ex) - { - ex.printStackTrace(); - } - return -1; - } + try { + return ping.getInt(getHandle.invoke(player)); + } catch (final IllegalAccessException | InvocationTargetException ex) { + ex.printStackTrace(); + } + return -1; + } - private void cacheReflection(final Player player) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException - { - getHandle = player.getClass().getDeclaredMethod("getHandle"); - getHandle.setAccessible(true); + private void cacheReflection(final Player player) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + getHandle = player.getClass().getDeclaredMethod("getHandle"); + getHandle.setAccessible(true); - final Object entityPlayer = getHandle.invoke(player); + final Object entityPlayer = getHandle.invoke(player); - ping = entityPlayer.getClass().getDeclaredField("ping"); - ping.setAccessible(true); - } - }; + ping = entityPlayer.getClass().getDeclaredField("ping"); + ping.setAccessible(true); + } + }; + + private static final Function PLAYER_GET_LOCALE = new Function() { + + private Field locale; + private Method getHandle; + + @Override + public String apply(final Player player) { + if (locale == null) { + try { + cacheReflection(player); + } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException | NoSuchFieldException ex) { + ex.printStackTrace(); + } + } + + try { + final Object entityPlayer = getHandle.invoke(player); + return (String) locale.get(entityPlayer); + } catch (final IllegalAccessException | InvocationTargetException ex) { + ex.printStackTrace(); + } + return "en_US"; + } - public static int getPing(final Player player) { - return PLAYER_GET_PING.apply(player); - } + private void cacheReflection(final Player player) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + getHandle = player.getClass().getDeclaredMethod("getHandle"); + getHandle.setAccessible(true); + + final Object entityPlayer = getHandle.invoke(player); + + locale = entityPlayer.getClass().getField("locale"); + } + }; + + + public static int getPing(final Player player) { + return PLAYER_GET_PING.apply(player); + } + + public static String getLocale(final Player player) { + return PLAYER_GET_LOCALE.apply(player); + } public static String format12(long ticks) { try { From fc6314ad5952c642aa504960cd4ee1e111567ea3 Mon Sep 17 00:00:00 2001 From: Maxim Van de Wynckel Date: Sat, 12 Jun 2021 20:49:25 +0200 Subject: [PATCH 05/17] fix: player ping on 1.17 --- .../expansion/player/PlayerExpansion.java | 24 ++++++++++++++++++- .../papi/expansion/player/PlayerUtil.java | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index cec9c55..65429dc 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -34,6 +34,8 @@ import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static com.extendedclip.papi.expansion.player.PlayerUtil.format12; import static com.extendedclip.papi.expansion.player.PlayerUtil.format24; @@ -62,7 +64,7 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi @Override public String getVersion() { - return "1.8.0"; + return "1.9.0"; } @Override @@ -389,4 +391,24 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return ChatColor.translateAlternateColorCodes('&', ping > 100 ? high : ping > 50 ? medium : low) + ping; } + /** + * Helper method to return the major version that the server is running. + * + * This is needed because in 1.17, NMS is no longer versioned. + * + * @return the major version of Minecraft the server is running + */ + public static int minecraftVersion() { + try { + final Matcher matcher = Pattern.compile("\\(MC: (\\d)\\.(\\d+)\\.?(\\d+?)?\\)").matcher(Bukkit.getVersion()); + if (matcher.find()) { + return Integer.parseInt(matcher.toMatchResult().group(2), 10); + } else { + throw new IllegalArgumentException(String.format("No match found in '%s'", Bukkit.getVersion())); + } + } catch (final IllegalArgumentException ex) { + throw new RuntimeException("Failed to determine Minecraft version", ex); + } + } + } diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java index 9c19f1e..8d4c8fb 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java @@ -76,7 +76,7 @@ public final class PlayerUtil { final Object entityPlayer = getHandle.invoke(player); - ping = entityPlayer.getClass().getDeclaredField("ping"); + ping = entityPlayer.getClass().getDeclaredField(PlayerExpansion.minecraftVersion() >= 17 ? "e" : "ping"); ping.setAccessible(true); } }; From e178109ecd79b69185f59ba6e3b662ffe26dce8e Mon Sep 17 00:00:00 2001 From: darbyjack Date: Sat, 12 Jun 2021 14:35:50 -0500 Subject: [PATCH 06/17] Initial 1.17 support --- pom.xml | 4 ++-- .../extendedclip/papi/expansion/player/PlayerExpansion.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5e55b5c..9631ddf 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.extendedclip.papi.expansion.player player-expansion - 1.8.0 + 2.0.0 PAPI-Expansion-Player PlaceholderAPI expansion for player placeholders @@ -30,7 +30,7 @@ org.spigotmc spigot-api - 1.16.3-R0.1-SNAPSHOT + 1.17-R0.1-SNAPSHOT provided diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 65429dc..bda4ea8 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -64,7 +64,7 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi @Override public String getVersion() { - return "1.9.0"; + return "2.0.0"; } @Override From a95eb4a3a05b1c038a2327d82001a8015153a83f Mon Sep 17 00:00:00 2001 From: Gabriel Dumitru Date: Mon, 12 Jul 2021 05:35:24 +0300 Subject: [PATCH 07/17] Add `%player_(x/y/z)_long%` Unlike `%player_(x/y/z)%`, this placeholder will show player's exact location, including decimals --- .../extendedclip/papi/expansion/player/PlayerExpansion.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index bda4ea8..4e06544 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -225,10 +225,16 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return ""; case "x": return String.valueOf(p.getLocation().getBlockX()); + case "x_long": + return String.valueOf(p.getLocation().getX()); case "y": return String.valueOf(p.getLocation().getBlockY()); + case "y_long": + return String.valueOf(p.getLocation().getY()); case "z": return String.valueOf(p.getLocation().getBlockZ()); + case "z_long": + return String.valueOf(p.getLocation().getZ()); case "yaw": return String.valueOf(p.getLocation().getYaw()); case "pitch": From 4e659ede765e67f52081b9952960b58eb6a3e381 Mon Sep 17 00:00:00 2001 From: Gabriel Dumitru Date: Mon, 12 Jul 2021 05:36:29 +0300 Subject: [PATCH 08/17] Version 2.0.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9631ddf..e096786 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.extendedclip.papi.expansion.player player-expansion - 2.0.0 + 2.0.1 PAPI-Expansion-Player PlaceholderAPI expansion for player placeholders From 473f637e0c0dafd54ccaf4439b7cf07ec2fd8af9 Mon Sep 17 00:00:00 2001 From: darbyjack Date: Mon, 12 Jul 2021 09:48:05 -0500 Subject: [PATCH 09/17] Push to 2.0.2 to fix versioning issue. --- pom.xml | 2 +- .../com/extendedclip/papi/expansion/player/PlayerExpansion.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e096786..4068b6d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.extendedclip.papi.expansion.player player-expansion - 2.0.1 + 2.0.2 PAPI-Expansion-Player PlaceholderAPI expansion for player placeholders diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 4e06544..7d26296 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -64,7 +64,7 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi @Override public String getVersion() { - return "2.0.0"; + return "2.0.2"; } @Override From a5b1a0dc10a501a85cd9919f7e24cb1fceb9e3ee Mon Sep 17 00:00:00 2001 From: eDexiam Date: Tue, 3 Aug 2021 21:46:51 +0200 Subject: [PATCH 10/17] Added ability to configure which ping threshold triggers what color. --- .../papi/expansion/player/PlayerExpansion.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 7d26296..36f7cbf 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -52,6 +52,9 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi private String medium; private String high; + private int mediumValue; + private int highValue; + @Override public String getIdentifier() { return "player"; @@ -73,6 +76,8 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi defaults.put("ping_color.high", "&c"); defaults.put("ping_color.medium", "&e"); defaults.put("ping_color.low", "&a"); + defaults.put("ping_value.medium", 250); + defaults.put("ping_value.high", 600); return defaults; } @@ -379,6 +384,9 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi low = this.getString("ping_color.low", "&a"); medium = this.getString("ping_color.medium", "&e"); high = this.getString("ping_color.high", "&c"); + mediumValue = this.getInt("ping_value.medium", 250); + highValue = this.getInt("ping_value.high", 600); + return super.register(); } @@ -394,7 +402,7 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return String.valueOf(ping); } - return ChatColor.translateAlternateColorCodes('&', ping > 100 ? high : ping > 50 ? medium : low) + ping; + return ChatColor.translateAlternateColorCodes('&', ping > highValue ? high : ping > mediumValue ? medium : low) + ping; } /** From 6772d34776bd4759b127a3ffaadcf3c39b57a3ef Mon Sep 17 00:00:00 2001 From: eDexiam Date: Tue, 3 Aug 2021 21:48:52 +0200 Subject: [PATCH 11/17] Restored default values from the official repo. --- .../papi/expansion/player/PlayerExpansion.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 36f7cbf..975d5f9 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -76,8 +76,8 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi defaults.put("ping_color.high", "&c"); defaults.put("ping_color.medium", "&e"); defaults.put("ping_color.low", "&a"); - defaults.put("ping_value.medium", 250); - defaults.put("ping_value.high", 600); + defaults.put("ping_value.medium", 50); + defaults.put("ping_value.high", 100); return defaults; } @@ -384,8 +384,8 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi low = this.getString("ping_color.low", "&a"); medium = this.getString("ping_color.medium", "&e"); high = this.getString("ping_color.high", "&c"); - mediumValue = this.getInt("ping_value.medium", 250); - highValue = this.getInt("ping_value.high", 600); + mediumValue = this.getInt("ping_value.medium", 50); + highValue = this.getInt("ping_value.high", 100); return super.register(); From c0a1780fba56ed33d263f883539a376fc560c745 Mon Sep 17 00:00:00 2001 From: BlitzOffline <52609756+BlitzOffline@users.noreply.github.com> Date: Sun, 5 Sep 2021 14:43:44 +0300 Subject: [PATCH 12/17] Added durability placeholders. --- .../papi/expansion/player/PlayerExpansion.java | 14 +++++++++++++- .../papi/expansion/player/PlayerUtil.java | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 7d26296..2ed050e 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -36,7 +36,7 @@ import org.bukkit.potion.PotionEffectType; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; - +import static com.extendedclip.papi.expansion.player.PlayerUtil.durability; import static com.extendedclip.papi.expansion.player.PlayerUtil.format12; import static com.extendedclip.papi.expansion.player.PlayerUtil.format24; import static com.extendedclip.papi.expansion.player.PlayerUtil.getBiome; @@ -287,12 +287,16 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return itemInHand(p).getType() != Material.AIR && itemInHand(p).getItemMeta().hasDisplayName() ? itemInHand(p).getItemMeta().getDisplayName() : ""; case "item_in_hand_data": return itemInHand(p).getType() != Material.AIR ? String.valueOf(itemInHand(p).getDurability()) : "0"; + case "item_in_hand_durability": + return String.valueOf(durability(itemInHand(p))); case "item_in_offhand": return String.valueOf(p.getInventory().getItemInOffHand().getType()); case "item_in_offhand_name": return p.getInventory().getItemInOffHand().getType() != Material.AIR && p.getInventory().getItemInOffHand().getItemMeta().hasDisplayName() ? p.getInventory().getItemInOffHand().getItemMeta().getDisplayName() : ""; case "item_in_offhand_data": return p.getInventory().getItemInOffHand().getType() != Material.AIR ? String.valueOf(p.getInventory().getItemInOffHand().getDurability()) : "0"; + case "item_in_offhand_durability": + return String.valueOf(durability(p.getInventory().getItemInOffHand())); case "last_damage": return String.valueOf(p.getLastDamage()); case "max_health": @@ -309,18 +313,26 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return Optional.ofNullable(p.getInventory().getHelmet()).map(a -> a.getItemMeta().getDisplayName()).orElse(""); case "armor_helmet_data": return p.getInventory().getHelmet() != null ? String.valueOf(p.getInventory().getHelmet().getDurability()) : "0"; + case "armor_helmet_durability": + return String.valueOf(durability(p.getInventory().getHelmet())); case "armor_chestplate_name": return Optional.ofNullable(p.getInventory().getChestplate()).map(a -> a.getItemMeta().getDisplayName()).orElse(""); case "armor_chestplate_data": return p.getInventory().getChestplate() != null ? String.valueOf(p.getInventory().getChestplate().getDurability()) : "0"; + case "armor_chestplate_durability": + return String.valueOf(durability(p.getInventory().getChestplate())); case "armor_leggings_name": return Optional.ofNullable(p.getInventory().getLeggings()).map(a -> a.getItemMeta().getDisplayName()).orElse(""); case "armor_leggings_data": return p.getInventory().getLeggings() != null ? String.valueOf(p.getInventory().getLeggings().getDurability()) : "0"; + case "armor_leggings_durability": + return String.valueOf(durability(p.getInventory().getLeggings())); case "armor_boots_name": return Optional.ofNullable(p.getInventory().getBoots()).map(a -> a.getItemMeta().getDisplayName()).orElse(""); case "armor_boots_data": return p.getInventory().getBoots() != null ? String.valueOf(p.getInventory().getBoots().getDurability()) : "0"; + case "armor_boots_durability": + return String.valueOf(durability(p.getInventory().getBoots())); case "ping": return retrievePing(p, false); case "colored_ping": diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java index 8d4c8fb..9ef84a5 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java @@ -210,6 +210,10 @@ public final class PlayerUtil { } } + public static int durability(ItemStack item) { + return item != null ? item.getType().getMaxDurability() - item.getDurability() : 0; + } + public static int getEmptySlots(Player p) { int slots = 0; PlayerInventory inv = p.getInventory(); From c00f74e758e6dd6e8ec016e416215dd428bb8aa8 Mon Sep 17 00:00:00 2001 From: BlitzOffline <52609756+BlitzOffline@users.noreply.github.com> Date: Sun, 5 Sep 2021 15:00:38 +0300 Subject: [PATCH 13/17] Use `p` instead of `player`. --- .../extendedclip/papi/expansion/player/PlayerExpansion.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 88bfd27..896d67a 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -230,8 +230,7 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi case "compass_world": return p.getCompassTarget() != null ? p.getCompassTarget().getWorld().getName() : ""; case "block_underneath": - Location loc = Objects.requireNonNull(player.getPlayer()).getLocation().clone().subtract(0, 1, 0); - return String.valueOf(loc.getBlock().getType()); + return String.valueOf(p.getLocation().clone().subtract(0, 1, 0).getBlock().getType()); case "custom_name": return p.getCustomName() != null ? p.getCustomName() : p.getName(); case "exp": From 2133751f8253c90a6a49e32374cf775672846296 Mon Sep 17 00:00:00 2001 From: BlitzOffline <52609756+BlitzOffline@users.noreply.github.com> Date: Sun, 5 Sep 2021 23:44:10 +0300 Subject: [PATCH 14/17] Made direction output configurable --- .../expansion/player/PlayerExpansion.java | 48 +++++++++++++++++-- .../papi/expansion/player/PlayerUtil.java | 37 ++------------ 2 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index e58f9ec..71de2c9 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -32,7 +32,6 @@ import org.bukkit.World; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; -import org.bukkit.Location; import java.util.*; import java.util.regex.Matcher; @@ -42,8 +41,8 @@ import static com.extendedclip.papi.expansion.player.PlayerUtil.format12; import static com.extendedclip.papi.expansion.player.PlayerUtil.format24; import static com.extendedclip.papi.expansion.player.PlayerUtil.getBiome; import static com.extendedclip.papi.expansion.player.PlayerUtil.getCapitalizedBiome; -import static com.extendedclip.papi.expansion.player.PlayerUtil.getCardinalDirection; import static com.extendedclip.papi.expansion.player.PlayerUtil.getEmptySlots; +import static com.extendedclip.papi.expansion.player.PlayerUtil.getDirection; import static com.extendedclip.papi.expansion.player.PlayerUtil.getTotalExperience; import static com.extendedclip.papi.expansion.player.PlayerUtil.getXZDirection; import static com.extendedclip.papi.expansion.player.PlayerUtil.itemInHand; @@ -56,6 +55,15 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi private int mediumValue; private int highValue; + private String north; + private String northEast; + private String east; + private String southEast; + private String south; + private String southWest; + private String west; + private String northWest; + @Override public String getIdentifier() { return "player"; @@ -79,6 +87,14 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi defaults.put("ping_color.low", "&a"); defaults.put("ping_value.medium", 50); defaults.put("ping_value.high", 100); + defaults.put("direction.north", "N"); + defaults.put("direction.north_east", "NE"); + defaults.put("direction.east", "E"); + defaults.put("direction.south_east", "SE"); + defaults.put("direction.south", "S"); + defaults.put("direction.south_west", "SW"); + defaults.put("direction.west", "W"); + defaults.put("direction.north_west", "NW"); return defaults; } @@ -214,7 +230,25 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi case "gamemode": return p.getGameMode().name(); case "direction": - return getCardinalDirection(p); + switch (getDirection(p)) { + case NORTH: + return north; + case NORTH_EAST: + return northEast; + case EAST: + return east; + case SOUTH_EAST: + return southEast; + case SOUTH: + return south; + case SOUTH_WEST: + return southWest; + case WEST: + return west; + case NORTH_WEST: + return northWest; + } + return ""; case "direction_xz": return getXZDirection(p); case "world": @@ -401,6 +435,14 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi high = this.getString("ping_color.high", "&c"); mediumValue = this.getInt("ping_value.medium", 50); highValue = this.getInt("ping_value.high", 100); + north = this.getString("direction.north", "N"); + northEast = this.getString("direction.north_east", "NE"); + east = this.getString("direction.east", "E"); + southEast = this.getString("direction.south_east", "SE"); + south = this.getString("direction.south", "S"); + southWest = this.getString("direction.south_west", "SW"); + west = this.getString("direction.west", "W"); + northWest = this.getString("direction.north_west", "NW"); return super.register(); diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java index 9ef84a5..247949d 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java @@ -2,6 +2,7 @@ package com.extendedclip.papi.expansion.player; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; @@ -42,6 +43,7 @@ public final class PlayerUtil { public static final double ticksPerMinute = 1000d / 60d; private static final SimpleDateFormat twentyFour = new SimpleDateFormat("HH:mm", Locale.ENGLISH); private static final SimpleDateFormat twelve = new SimpleDateFormat("h:mm aa", Locale.ENGLISH); + private static final BlockFace[] radial = { BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST }; private PlayerUtil() { } @@ -148,39 +150,8 @@ public final class PlayerUtil { return (hours < 10 ? "0" + hours : hours) + ":" + (mins < 10 ? "0" + mins : mins); } - public static String getCardinalDirection(Player player) { - double rotation = player.getLocation().getYaw() - 180.0F; - if (rotation < 0.0D) { - rotation += 360.0D; - } - if ((0.0D <= rotation) && (rotation < 22.5D)) { - return "N"; - } - if ((22.5D <= rotation) && (rotation < 67.5D)) { - return "NE"; - } - if ((67.5D <= rotation) && (rotation < 112.5D)) { - return "E"; - } - if ((112.5D <= rotation) && (rotation < 157.5D)) { - return "SE"; - } - if ((157.5D <= rotation) && (rotation < 202.5D)) { - return "S"; - } - if ((202.5D <= rotation) && (rotation < 247.5D) || (rotation <= -119.33) && (rotation > -179)) { - return "SW"; - } - if ((247.5D <= rotation) && (rotation < 292.5D) || (rotation <= -59.66) && (rotation > -119.33)) { - return "W"; - } - if ((292.5D <= rotation) && (rotation < 337.5D) || (rotation <= -0.0) && (rotation > -59.66)) { - return "NW"; - } - if ((337.5D <= rotation) && (rotation < 360.0D)) { - return "N"; - } - return ""; + public static BlockFace getDirection(Player player) { + return radial[Math.round(player.getLocation().getYaw() / 45f) & 0x7].getOppositeFace(); } public static String getXZDirection(Player player) { From 9b2c4b9cd89e0bb422f29e34e6b69392d7c112ab Mon Sep 17 00:00:00 2001 From: iGabyTM Date: Fri, 1 Oct 2021 12:37:12 +0300 Subject: [PATCH 15/17] add Matt's VersionHelper util --- .../papi/expansion/player/VersionHelper.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/main/java/com/extendedclip/papi/expansion/player/VersionHelper.java diff --git a/src/main/java/com/extendedclip/papi/expansion/player/VersionHelper.java b/src/main/java/com/extendedclip/papi/expansion/player/VersionHelper.java new file mode 100644 index 0000000..b37bd68 --- /dev/null +++ b/src/main/java/com/extendedclip/papi/expansion/player/VersionHelper.java @@ -0,0 +1,55 @@ +package com.extendedclip.papi.expansion.player; + +import com.google.common.primitives.Ints; +import org.bukkit.Bukkit; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Matt (@ipsk) + */ +public final class VersionHelper { + + private static final int VERSION = getCurrentVersion(); + + /** + * + * Damageable#getAbsorptionAmount + * + */ + public static final boolean HAS_ABSORPTION_METHODS = VERSION >= 1_15_0; + + public static final boolean IS_1_17_OR_NEWER = VERSION >= 1_17_0; + + private VersionHelper() { } + + /** + * Gets the current server version + * + * @return A protocol like number representing the version, for example 1.16.5 - 1165 + */ + private static int getCurrentVersion() { + // No need to cache since will only run once + final Matcher matcher = Pattern.compile("(?\\d+\\.\\d+)(?\\.\\d+)?").matcher(Bukkit.getBukkitVersion()); + final StringBuilder stringBuilder = new StringBuilder(); + + if (matcher.find()) { + final String patch = matcher.group("patch"); + + stringBuilder + .append(matcher.group("version").replace(".", "")) + .append((patch == null) ? "0" : patch.replace(".", "")); + } + + final Integer version = Ints.tryParse(stringBuilder.toString()); + + // Should never fail + if (version == null) { + throw new IllegalArgumentException("Could not retrieve server version!"); + } + + return version; + } + +} From 14993335830a11d75dd4716f113580033d6c0159 Mon Sep 17 00:00:00 2001 From: iGabyTM Date: Fri, 1 Oct 2021 12:37:52 +0300 Subject: [PATCH 16/17] add %player_absorption% (closes #35) --- .../expansion/player/PlayerExpansion.java | 32 +++++++------------ .../papi/expansion/player/PlayerUtil.java | 5 ++- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java index 71de2c9..913216d 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerExpansion.java @@ -159,6 +159,11 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi Player p = player.getPlayer(); + // to get rid of IDE warnings + if (p == null) { + return ""; + } + if (identifier.startsWith("has_permission_")) { if (identifier.split("has_permission_").length > 1) { String perm = identifier.split("has_permission_")[1]; @@ -218,6 +223,13 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi } switch (identifier) { + case "absorption": { + if (VersionHelper.HAS_ABSORPTION_METHODS) { + return Integer.toString((int) p.getAbsorptionAmount()); + } else { + return "-1"; + } + } case "has_empty_slot": return bool(p.getInventory().firstEmpty() > -1); case "empty_slots": @@ -462,24 +474,4 @@ public final class PlayerExpansion extends PlaceholderExpansion implements Confi return ChatColor.translateAlternateColorCodes('&', ping > highValue ? high : ping > mediumValue ? medium : low) + ping; } - /** - * Helper method to return the major version that the server is running. - * - * This is needed because in 1.17, NMS is no longer versioned. - * - * @return the major version of Minecraft the server is running - */ - public static int minecraftVersion() { - try { - final Matcher matcher = Pattern.compile("\\(MC: (\\d)\\.(\\d+)\\.?(\\d+?)?\\)").matcher(Bukkit.getVersion()); - if (matcher.find()) { - return Integer.parseInt(matcher.toMatchResult().group(2), 10); - } else { - throw new IllegalArgumentException(String.format("No match found in '%s'", Bukkit.getVersion())); - } - } catch (final IllegalArgumentException ex) { - throw new RuntimeException("Failed to determine Minecraft version", ex); - } - } - } diff --git a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java index 247949d..419ea5b 100644 --- a/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java +++ b/src/main/java/com/extendedclip/papi/expansion/player/PlayerUtil.java @@ -45,8 +45,7 @@ public final class PlayerUtil { private static final SimpleDateFormat twelve = new SimpleDateFormat("h:mm aa", Locale.ENGLISH); private static final BlockFace[] radial = { BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST }; - private PlayerUtil() { - } + private PlayerUtil() { } private static final Function PLAYER_GET_PING = new Function() { @@ -78,7 +77,7 @@ public final class PlayerUtil { final Object entityPlayer = getHandle.invoke(player); - ping = entityPlayer.getClass().getDeclaredField(PlayerExpansion.minecraftVersion() >= 17 ? "e" : "ping"); + ping = entityPlayer.getClass().getDeclaredField(VersionHelper.IS_1_17_OR_NEWER ? "e" : "ping"); ping.setAccessible(true); } }; From be1998ced3246bb69013566028cdd8f28cde612f Mon Sep 17 00:00:00 2001 From: iGabyTM Date: Fri, 1 Oct 2021 13:22:16 +0300 Subject: [PATCH 17/17] increase version to 2.0.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4068b6d..b53a7ad 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.extendedclip.papi.expansion.player player-expansion - 2.0.2 + 2.0.3 PAPI-Expansion-Player PlaceholderAPI expansion for player placeholders