diff --git a/pom.xml b/pom.xml
index 79a78cc..50a876b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.modularsoft
PlayerHeadHunt
- 1.1.1
+ 1.2.0
UTF-8
@@ -18,7 +18,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.8.1
+ 3.13.0
17
@@ -26,7 +26,7 @@
org.apache.maven.plugins
maven-shade-plugin
- 3.4.1
+ 3.5.3
package
@@ -37,7 +37,7 @@
org.apache.hc
- org.modularsoft.PlayerHeadHunt.shaded.org.apache.hc
+ org.modularsoft.PlayerHeadHunt.shaded.org.apache.hc
@@ -71,7 +71,7 @@
io.papermc.paper
paper-api
- 1.20.4-R0.1-SNAPSHOT
+ 1.21.4-R0.1-SNAPSHOT
provided
@@ -111,20 +111,20 @@
org.projectlombok
lombok
- 1.18.30
+ 1.18.36
provided
org.yaml
snakeyaml
- 2.0
+ 2.3
org.apache.httpcomponents.client5
httpclient5
- 5.2
+ 5.4.1
diff --git a/src/main/java/org/modularsoft/PlayerHeadHunt/HeadChatController.java b/src/main/java/org/modularsoft/PlayerHeadHunt/HeadChatController.java
index d1320e1..0944b7f 100644
--- a/src/main/java/org/modularsoft/PlayerHeadHunt/HeadChatController.java
+++ b/src/main/java/org/modularsoft/PlayerHeadHunt/HeadChatController.java
@@ -101,12 +101,22 @@ public void newPlayerJoinsTheHunt(Player player) {
}
public void playersOwnHeadCountResponse(Player player) {
- // Use the instance of HeadQuery to call the method
player.sendMessage(plugin.config().getLangHeadCount()
.replace("%FOUNDHEADS%", "" + headQuery.foundHeadsCount(player))
.replace("%NUMBEROFHEADS%", "" + plugin.config().getTotalHeads()));
}
+ public void targetPlayerHeadCountResponse(org.bukkit.command.CommandSender sender, String targetName, int count) {
+ if (count == -1) {
+ sender.sendMessage(ChatColor.RED + "No data found for player: " + targetName);
+ return;
+ }
+ sender.sendMessage(plugin.config().getLangHeadCount()
+ .replace("%FOUNDHEADS%", "" + count)
+ .replace("%NUMBEROFHEADS%", "" + plugin.config().getTotalHeads())
+ .replace("You have", targetName + " has"));
+ }
+
public void playerClearedTheirHeadsResponse(Player player) {
player.sendMessage("All heads have been cleared.");
}
diff --git a/src/main/java/org/modularsoft/PlayerHeadHunt/HeadQuery.java b/src/main/java/org/modularsoft/PlayerHeadHunt/HeadQuery.java
index a6e4fa4..100801d 100644
--- a/src/main/java/org/modularsoft/PlayerHeadHunt/HeadQuery.java
+++ b/src/main/java/org/modularsoft/PlayerHeadHunt/HeadQuery.java
@@ -12,6 +12,7 @@
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
public class HeadQuery {
private final YamlFileManager yamlFileManager;
@@ -50,24 +51,28 @@ public int foundHeadsCount(Player player) {
public int foundHeadsAlreadyCount(int xCord, int yCord, int zCord) {
Map data = yamlFileManager.getData();
- Object headsObject = data.get("heads");
+ int count = 0;
- // Ensure the "heads" object is a list
- if (!(headsObject instanceof List>)) {
- return 0; // Return 0 if the data is not a list
+ for (Map.Entry entry : data.entrySet()) {
+ if (!(entry.getValue() instanceof Map, ?> playerData)) continue;
+
+ Object headsObj = playerData.get("headsCollected");
+ if (!(headsObj instanceof List> heads)) continue;
+
+ for (Object head : heads) {
+ if (!(head instanceof Map, ?> headMap)) continue;
+ Object hx = headMap.get("x");
+ Object hy = headMap.get("y");
+ Object hz = headMap.get("z");
+ if (hx instanceof Integer && hy instanceof Integer && hz instanceof Integer
+ && (Integer) hx == xCord && (Integer) hy == yCord && (Integer) hz == zCord) {
+ count++;
+ break; // each player counts once per head location
+ }
+ }
}
- List> heads = (List>) headsObject;
-
- // Filter and count matching heads
- return (int) heads.stream()
- .filter(head -> head instanceof Map)
- .map(head -> (Map) head)
- .filter(head ->
- head.get("x") instanceof Integer && head.get("y") instanceof Integer && head.get("z") instanceof Integer &&
- head.get("x").equals(xCord) && head.get("y").equals(yCord) && head.get("z").equals(zCord)
- )
- .count();
+ return count;
}
public boolean clearHeads(Player player) {
@@ -108,7 +113,7 @@ public boolean hasAlreadyCollectedHead(Player player, int x, int y, int z) {
// Check if the head coordinates already exist in the list
return headsCollected.stream().anyMatch(head ->
- head.get("x") == x && head.get("y") == y && head.get("z") == z);
+ Objects.equals(head.get("x"), x) && Objects.equals(head.get("y"), y) && Objects.equals(head.get("z"), z));
}
public void insertCollectedHead(Player player, int x, int y, int z) {
@@ -163,6 +168,52 @@ public boolean addNewHunter(Player player) {
return true;
}
+ public int foundHeadsCountByName(String playerName) {
+ Map data = yamlFileManager.getData();
+ for (Map.Entry entry : data.entrySet()) {
+ if (!(entry.getValue() instanceof Map, ?> playerData)) continue;
+ String username = (String) playerData.get("username");
+ if (!playerName.equalsIgnoreCase(username)) continue;
+ Object headsObj = playerData.get("headsCollected");
+ if (headsObj instanceof List> heads) {
+ return heads.size();
+ }
+ return 0;
+ }
+ return -1; // -1 indicates player not found in data
+ }
+
+ public boolean clearHeadsByName(String playerName) {
+ Map data = yamlFileManager.getData();
+ for (Map.Entry entry : data.entrySet()) {
+ if (!(entry.getValue() instanceof Map, ?> rawPlayerData)) continue;
+ String username = (String) rawPlayerData.get("username");
+ if (!playerName.equalsIgnoreCase(username)) continue;
+
+ Map playerData = (Map) entry.getValue();
+ List