From 3548c8911064b986b596f0ac358597176a909731 Mon Sep 17 00:00:00 2001
From: T14D3 <73843330+T14D3@users.noreply.github.com>
Date: Thu, 9 Jan 2025 17:57:54 +0100
Subject: [PATCH] Added more placeholders, added placeholder tabcomplete
---
src/main/java/de/t14d3/zones/Region.java | 18 +++
.../zones/integrations/PlaceholderAPI.java | 146 +++++++++++++++++-
2 files changed, 162 insertions(+), 2 deletions(-)
diff --git a/src/main/java/de/t14d3/zones/Region.java b/src/main/java/de/t14d3/zones/Region.java
index b3c0f41..24e8e51 100644
--- a/src/main/java/de/t14d3/zones/Region.java
+++ b/src/main/java/de/t14d3/zones/Region.java
@@ -111,6 +111,13 @@ void setMax(BlockVector max) {
this.max.set(max.getBlockX(), max.getBlockY(), max.getBlockZ());
}
+ /**
+ * Get the members of this region and their permissions.
+ * Use {@link de.t14d3.zones.PermissionManager#hasPermission} to check player permissions.
+ *
+ * @return {@code Map permissions>}
+ * @see de.t14d3.zones.PermissionManager#hasPermission
+ */
public Map> getMembers() {
return members;
}
@@ -190,6 +197,17 @@ void addMemberPermission(UUID uuid, String permission, String value, RegionManag
regionManager.saveRegion(key, this); // Ensure changes are saved
}
+ public @Nullable UUID getOwner() {
+ for (Map.Entry> entry : members.entrySet()) {
+ Map map = entry.getValue();
+ if (map.containsKey("role") && map.get("role").equalsIgnoreCase("owner")) {
+ return entry.getKey();
+ }
+ }
+ return null;
+ }
+
+
JsonObject getAsJson() {
JsonObject json = new JsonObject();
json.addProperty("name", getName());
diff --git a/src/main/java/de/t14d3/zones/integrations/PlaceholderAPI.java b/src/main/java/de/t14d3/zones/integrations/PlaceholderAPI.java
index bbe4ae3..56fd31e 100644
--- a/src/main/java/de/t14d3/zones/integrations/PlaceholderAPI.java
+++ b/src/main/java/de/t14d3/zones/integrations/PlaceholderAPI.java
@@ -1,10 +1,15 @@
package de.t14d3.zones.integrations;
+import de.t14d3.zones.Region;
import de.t14d3.zones.Zones;
+import de.t14d3.zones.utils.Actions;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
+import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
+import java.util.List;
+
public class PlaceholderAPI extends PlaceholderExpansion {
private final Zones plugin;
@@ -35,12 +40,149 @@ public boolean persist() {
return true;
}
+ @Override
+ public @NotNull List getPlaceholders() {
+ return List.of("%zones_get_name%",
+ "%zones_get_key%",
+ "%zones_get_members%",
+ "%zones_get_owner%",
+ "%zones_get_min%",
+ "%zones_get_min_x%",
+ "%zones_get_min_y%",
+ "%zones_get_min_z%",
+ "%zones_get_max%",
+ "%zones_get_max_x%",
+ "%zones_get_max_y%",
+ "%zones_get_max_z%",
+ "%zones_is_member%",
+ "%zones_can_place_hand%",
+ "%zones_can_break_target%",
+ "%zones_can__%");
+ }
+
@Override
public String onPlaceholderRequest(Player player, @NotNull String params) {
- if (params.equalsIgnoreCase("get_here")) {
- return plugin.getRegionManager().getRegionsAtAsync(player.getLocation()).join().get(0).getName();
+ List regions = plugin.getRegionManager().getRegionsAtAsync(player.getLocation()).join();
+ if (params.equalsIgnoreCase("get_name")) {
+ String name = "";
+ if (!regions.isEmpty()) {
+ name = regions.get(0).getName();
+ }
+ return name;
+ }
+ if (params.equalsIgnoreCase("get_key")) {
+ String key = "";
+ if (!regions.isEmpty()) {
+ key = regions.get(0).getKey();
+ }
+ return key;
}
+ if (params.equalsIgnoreCase("get_members")) {
+ final String[] members = {""};
+ regions.get(0).getMembers().keySet().forEach(uuid -> {
+ String member = Bukkit.getOfflinePlayer(uuid).getName() != null ? Bukkit.getOfflinePlayer(uuid).getName() : uuid.toString();
+ if (members[0].isEmpty()) {
+ members[0] = member;
+ } else {
+ members[0] = members[0] + ", " + member;
+ }
+ }
+ );
+ return members[0];
+ }
+ if (params.equalsIgnoreCase("get_owner")) {
+ String owner = "";
+ if (!regions.isEmpty()) {
+ if (regions.get(0).getOwner() != null) {
+ owner = Bukkit.getOfflinePlayer(regions.get(0).getOwner()).getName() != null
+ ? Bukkit.getOfflinePlayer(regions.get(0).getOwner()).getName() : "";
+ }
+ }
+ return owner;
+ }
+ if (params.equalsIgnoreCase("get_min")) {
+ if (!regions.isEmpty()) {
+ return regions.get(0).getMinString();
+ }
+ return "";
+ }
+ if (params.equalsIgnoreCase("get_min_x")) {
+ if (!regions.isEmpty()) {
+ return String.valueOf(regions.get(0).getMin().getBlockX());
+ }
+ return "";
+ }
+ if (params.equalsIgnoreCase("get_min_y")) {
+ int minY = 0;
+ if (!regions.isEmpty()) {
+ minY = regions.get(0).getMin().getBlockY();
+ }
+ return String.valueOf(minY);
+ }
+ if (params.equalsIgnoreCase("get_min_z")) {
+ if (!regions.isEmpty()) {
+ return String.valueOf(regions.get(0).getMin().getBlockZ());
+ }
+ return "";
+ }
+ if (params.equalsIgnoreCase("get_max")) {
+ if (!regions.isEmpty()) {
+ return regions.get(0).getMaxString();
+ }
+ return "";
+ }
+ if (params.equalsIgnoreCase("get_max_x")) {
+ if (!regions.isEmpty()) {
+ return String.valueOf(regions.get(0).getMax().getBlockX());
+ }
+ return "";
+ }
+ if (params.equalsIgnoreCase("get_max_y")) {
+ if (!regions.isEmpty()) {
+ return String.valueOf(regions.get(0).getMax().getBlockY());
+ }
+ return "";
+ }
+ if (params.equalsIgnoreCase("get_max_z")) {
+ if (!regions.isEmpty()) {
+ return String.valueOf(regions.get(0).getMax().getBlockZ());
+ }
+ return "";
+ }
+ if (params.equalsIgnoreCase("is_member")) {
+ if (!regions.isEmpty()) {
+ return regions.get(0).isMember(player.getUniqueId()) ? "true" : "false";
+ }
+ return "false";
+ }
+ if (params.equalsIgnoreCase("can_place_hand")) {
+ if (!regions.isEmpty()) {
+ return plugin.getPermissionManager().canInteract(player.getLocation(), player.getUniqueId(), Actions.PLACE, player.getInventory().getItemInMainHand().getType().name()) ? "true" : "false";
+ }
+ return "false";
+ }
+ if (params.equalsIgnoreCase("can_break_target")) {
+ if (!regions.isEmpty()) {
+ return plugin.getPermissionManager().canInteract(
+ player.getLocation(),
+ player.getUniqueId(),
+ Actions.BREAK,
+ player.getTargetBlockExact(5) != null
+ ? player.getTargetBlockExact(5).getType().name() : "")
+ ? "true" : "false";
+ }
+ return "false";
+ }
+ if (params.startsWith("can_")) {
+ String action = params.split("_")[1].toUpperCase();
+ // There's definitely a better way to do this, but it works and I'm too lazy to find a better one
+ String type = params.substring(params.indexOf('_', params.indexOf('_') + 1) + 1);
+ if (!regions.isEmpty()) {
+ return plugin.getPermissionManager().canInteract(player.getLocation(), player.getUniqueId(), Actions.valueOf(action), type) ? "true" : "false";
+ }
+ return "false";
+ }
return null;
}
}