diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index cf12048..5d33d31 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -16,6 +16,11 @@
+
+
+
+
+
diff --git a/README.MD b/README.MD
index 897cb55..2c3791b 100644
--- a/README.MD
+++ b/README.MD
@@ -48,6 +48,7 @@ Currently, the plugin implements the following features, so far:
- [X] Prison Gangs **
- [X] Additional Gang Commands (kick, promote, disband) **
- [X] Tree Farm **
+ - [x] Gang PlaceholderAPI support (display Gang Name for chat etc)
- [ ] Spawn with Prisoner Tools (Toggable)
- [ ] Restrict Prisoner Tools from moving in inventory and dropping? (Toggable)
- [ ] Prisoner Tokens or Gems (Tied into Vault?)\
diff --git a/pom.xml b/pom.xml
index ed9fb2f..3df6caf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.NVus
NVus_Prison
- 0.9.5
+ 0.9.7
jar
NVus_PrisonSetup
@@ -96,6 +96,11 @@
enginehub
https://maven.enginehub.org/repo/
+
+
+ placeholderapi
+ https://repo.extendedclip.com/content/repositories/placeholderapi/
+
@@ -123,18 +128,28 @@
1.20.4-R0.1-SNAPSHOT
provided
+
+
+ me.clip
+ placeholderapi
+ 2.11.4
+ provided
+
+
com.sk89q.worldguard
worldguard-bukkit
7.0.3
provided
+
com.sk89q.worldedit
worldedit-bukkit
7.3.0
provided
+
com.fastasyncworldedit
FastAsyncWorldEdit-Core
diff --git a/src/main/java/me/nvus/nvus_prison_setup/Database/DatabaseManager.java b/src/main/java/me/nvus/nvus_prison_setup/Database/DatabaseManager.java
index 30d2d6a..481cc98 100644
--- a/src/main/java/me/nvus/nvus_prison_setup/Database/DatabaseManager.java
+++ b/src/main/java/me/nvus/nvus_prison_setup/Database/DatabaseManager.java
@@ -82,25 +82,64 @@ public class DatabaseManager {
initializeDatabase();
}
- public void createGang(String name, String ownerUuid) {
- String sql = "INSERT INTO nvus_gangs(name, owner_uuid) VALUES(?,?)";
+ public void createGang(String name, String ownerUuid, String ownerName) {
+ String insertGangSQL = "INSERT INTO nvus_gangs(name, owner_uuid) VALUES(?,?)";
+ String insertMemberSQL = "INSERT INTO nvus_gangs_members(uuid, username, gang_id, rank) VALUES(?,?,(SELECT id FROM nvus_gangs WHERE owner_uuid = ?),'Owner')";
try (Connection conn = this.connect();
- PreparedStatement pstmt = conn.prepareStatement(sql)) {
- pstmt.setString(1, name);
- pstmt.setString(2, ownerUuid);
- pstmt.executeUpdate();
+ PreparedStatement insertGangStmt = conn.prepareStatement(insertGangSQL, Statement.RETURN_GENERATED_KEYS);
+ PreparedStatement insertMemberStmt = conn.prepareStatement(insertMemberSQL)) {
+
+ // Insert the gang
+ insertGangStmt.setString(1, name);
+ insertGangStmt.setString(2, ownerUuid);
+ insertGangStmt.executeUpdate();
+
+ // Insert the owner as a member
+ insertMemberStmt.setString(1, ownerUuid);
+ insertMemberStmt.setString(2, ownerName);
+ insertMemberStmt.setString(3, ownerUuid); // Re-use owner UUID to fetch the gang ID
+ insertMemberStmt.executeUpdate();
+
} catch (SQLException e) {
- System.out.println(e.getMessage());
+ System.out.println("Error creating gang and adding owner as member: " + e.getMessage());
}
}
+
+
+// public void createGang(String name, String ownerUuid) {
+// String sql = "INSERT INTO nvus_gangs(name, owner_uuid) VALUES(?,?)";
+// String sqlMember = "INSERT INTO nvus_gangs_members(name, owner_uuid) VALUES(?,?)";
+// try (Connection conn = this.connect();
+// PreparedStatement pstmt = conn.prepareStatement(sql)) {
+// pstmt.setString(1, name);
+// pstmt.setString(2, ownerUuid);
+// pstmt.executeUpdate();
+// }
+// catch (SQLException e) {
+// System.out.println(e.getMessage());
+// }
+// try (Connection conn = this.connect();
+// PreparedStatement pstmt = conn.prepareStatement(sqlMember)) {
+// pstmt.setString(1, name);
+// pstmt.setString(2, ownerUuid);
+// pstmt.executeUpdate();
+// }
+// catch (SQLException e) {
+// System.out.println(e.getMessage());
+// }
+// }
+
public GangInfo getGangInfo(String gangName) {
- String gangInfoQuery = "SELECT g.name, (SELECT username FROM members WHERE uuid = g.owner_uuid) AS ownerName, COUNT(m.uuid) AS memberCount " +
+ // Updated query to match gang_id from nvus_gangs_members with id in nvus_gangs, maybe a re-write is needed to match these id's as gangid??
+ String gangInfoQuery = "SELECT g.name, " +
+ "(SELECT username FROM nvus_gangs_members WHERE uuid = g.owner_uuid) AS ownerName, " +
+ "COUNT(m.uuid) AS memberCount " +
"FROM nvus_gangs g " +
- "LEFT JOIN nvus_gangs_members m ON g.id = m.gang_id " +
+ "JOIN nvus_gangs_members m ON g.id = m.gang_id " +
"WHERE g.name = ? " +
- "GROUP BY g.name";
+ "GROUP BY g.name, g.owner_uuid";
try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(gangInfoQuery)) {
@@ -121,6 +160,7 @@ public class DatabaseManager {
+
public boolean removeGang(String gangName) {
String sql = "DELETE FROM nvus_gangs WHERE name = ?";
diff --git a/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangCommands.java b/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangCommands.java
index 592d26c..55767f3 100644
--- a/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangCommands.java
+++ b/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangCommands.java
@@ -50,8 +50,8 @@ public class GangCommands implements CommandExecutor {
return handleGangKick(sender, args);
case "disband":
return handleGangDisband(sender, args);
- case "list":
- return handleGangList(sender, args);
+ case "info":
+ return handleGangInfo(sender, args);
default:
player.sendMessage(ChatColor.RED + "Invalid gang command. Use /gang help for a list of commands.");
return true;
@@ -202,7 +202,7 @@ public class GangCommands implements CommandExecutor {
message.append(ChatColor.LIGHT_PURPLE).append("NVus Prison Gangs:\n");
message.append(ChatColor.DARK_GRAY).append("=======\n");
message.append(ChatColor.GREEN).append("/gang create - Use this to create a gang.\n");
- message.append(ChatColor.GREEN).append("/gang list - Get info about your current gang.\n");
+ message.append(ChatColor.GREEN).append("/gang info - Get info about your current gang.\n");
message.append(ChatColor.GREEN).append("/gang invite - Invite player to your gang.\n");
message.append(ChatColor.GREEN).append("\n");
message.append(ChatColor.GREEN).append("/gang accept - Accept an invite to a gang.\n");
@@ -225,6 +225,7 @@ public class GangCommands implements CommandExecutor {
return true;
}
+ // Check if exactly two arguments are provided (/gang create )
if (args.length != 2) {
player.sendMessage(ChatColor.RED + "Usage: /gang create ");
return true;
@@ -232,6 +233,18 @@ public class GangCommands implements CommandExecutor {
String gangName = args[1];
+ // Check if the gang name is a single word
+ if (gangName.contains(" ")) {
+ player.sendMessage(ChatColor.RED + "Gang name must be a single word.");
+ return true;
+ }
+
+ // Check if the gang name length is between 3 and 6 characters
+ if (gangName.length() < 3 || gangName.length() > 6) {
+ player.sendMessage(ChatColor.RED + "Gang name must be between 3 and 6 letters.");
+ return true;
+ }
+
// Check if the player already belongs to a gang
String currentGang = gangManager.getCurrentGangName(player.getUniqueId());
if (currentGang != null) {
@@ -249,6 +262,7 @@ public class GangCommands implements CommandExecutor {
}
+
private boolean handleGangInvite(CommandSender sender, String[] args) {
if (args.length != 3) {
sender.sendMessage("Usage: /nvus gang invite ");
@@ -317,7 +331,7 @@ public class GangCommands implements CommandExecutor {
return true;
}
- private boolean handleGangList(CommandSender sender, String[] args) {
+ private boolean handleGangInfo(CommandSender sender, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("This command can only be used by players.");
return true;
@@ -327,7 +341,7 @@ public class GangCommands implements CommandExecutor {
String gangName = gangManager.getCurrentGangName(player.getUniqueId());
if (gangName == null) {
- player.sendMessage("You are not in a gang.");
+ player.sendMessage("You are not currently in a gang! Maybe create or... join one? ;)");
return true;
}
diff --git a/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangManager.java b/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangManager.java
index 359d1bb..3398aef 100644
--- a/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangManager.java
+++ b/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangManager.java
@@ -53,8 +53,10 @@ public class GangManager {
}
public boolean createGang(String gangName, Player owner) {
- if (dbManager.getGangIdByName(gangName) != null) return false;
- dbManager.createGang(gangName, owner.getUniqueId().toString());
+ if (dbManager.getGangIdByName(gangName) != null) {
+ return false; // Gang already exists
+ }
+ dbManager.createGang(gangName, owner.getUniqueId().toString(), owner.getName());
return true;
}
diff --git a/src/main/java/me/nvus/nvus_prison_setup/Placeholders/GangPlaceholders.java b/src/main/java/me/nvus/nvus_prison_setup/Placeholders/GangPlaceholders.java
new file mode 100644
index 0000000..35c80f0
--- /dev/null
+++ b/src/main/java/me/nvus/nvus_prison_setup/Placeholders/GangPlaceholders.java
@@ -0,0 +1,45 @@
+package me.nvus.nvus_prison_setup.Placeholders;
+
+import me.clip.placeholderapi.expansion.PlaceholderExpansion;
+import me.clip.placeholderapi.expansion.PlaceholderExpansion;
+import org.bukkit.entity.Player;
+import me.nvus.nvus_prison_setup.Gangs.GangManager;
+
+public class GangPlaceholders extends PlaceholderExpansion {
+
+ private GangManager gangManager;
+
+ public GangPlaceholders(GangManager gangManager) {
+ this.gangManager = gangManager;
+ }
+
+ @Override
+ public String getIdentifier() {
+ return "nvus";
+ }
+
+ @Override
+ public String getAuthor() {
+ return "never2nv";
+ }
+
+ @Override
+ public String getVersion() {
+ return "1.0";
+ }
+
+ @Override
+ public String onPlaceholderRequest(Player player, String identifier) {
+ if (player == null) {
+ return "";
+ }
+
+ // Placeholder: %nvus_gang_name%
+ if (identifier.equals("gang_name")) {
+ String gangName = gangManager.getCurrentGangName(player.getUniqueId());
+ return gangName != null ? gangName : "No Gang";
+ }
+
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/me/nvus/nvus_prison_setup/PrisonSetup.java b/src/main/java/me/nvus/nvus_prison_setup/PrisonSetup.java
index 2e72272..abdbd9a 100644
--- a/src/main/java/me/nvus/nvus_prison_setup/PrisonSetup.java
+++ b/src/main/java/me/nvus/nvus_prison_setup/PrisonSetup.java
@@ -9,6 +9,7 @@ import me.nvus.nvus_prison_setup.Listeners.PlayerItems;
import me.nvus.nvus_prison_setup.Listeners.PlayerSpawn;
import me.nvus.nvus_prison_setup.Listeners.BlockListener;
import me.nvus.nvus_prison_setup.Listeners.ToolSwitchListener;
+import me.nvus.nvus_prison_setup.Placeholders.GangPlaceholders;
import me.nvus.nvus_prison_setup.Updater.UpdateChecker;
import me.nvus.nvus_prison_setup.Listeners.ToolDamageListener;
import me.nvus.nvus_prison_setup.TreeFarm.TreeFarmListener;
@@ -75,6 +76,10 @@ public final class PrisonSetup extends JavaPlugin {
// Gang Related... GANG, GANG #LOLOLOLOL
this.getCommand("gang").setExecutor(new GangCommands(dbManager)); // Now correctly using initialized dbManager
+ // Register the Gangs placeholder expansion
+ if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
+ new GangPlaceholders(gangManager).register();
+ }
// Settings Menu
getServer().getPluginManager().registerEvents(new SettingsMenu(this, configManager), this);
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index d132d6e..0e57aa9 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -10,6 +10,7 @@ depend:
- WorldGuard
softdepend:
+ - PlaceholderAPI
- WorldEdit
- FastAsyncWorldEdit
@@ -31,7 +32,7 @@ commands:
description: Base command for gang-related actions.
usage: |
/gang create - Create a gang.
- /gang list - View your Gang info.
+ /gang info - View your current Gangs info.
/gang invite - Invite a player to your gang.
/gang accept - Accept a Gang Invite.
/gang deny - Decline a Gang Invite.