v0.9.7 - Added PlaceholderAPI support (softdepend) for Gangs. Fixed database issues and registering newly created gangs. Added gang owners as members of gang to correctly fix /gang info command (previously /gang list)

This commit is contained in:
WildInterloper 2024-03-12 13:12:18 -04:00
parent 88d4818062
commit ee60d3f0b3
9 changed files with 147 additions and 19 deletions

View File

@ -16,6 +16,11 @@
<option name="name" value="papermc-repo" /> <option name="name" value="papermc-repo" />
<option name="url" value="https://repo.papermc.io/repository/maven-public/" /> <option name="url" value="https://repo.papermc.io/repository/maven-public/" />
</remote-repository> </remote-repository>
<remote-repository>
<option name="id" value="placeholderapi" />
<option name="name" value="placeholderapi" />
<option name="url" value="https://repo.extendedclip.com/content/repositories/placeholderapi/" />
</remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="central" /> <option name="id" value="central" />
<option name="name" value="Maven Central repository" /> <option name="name" value="Maven Central repository" />

View File

@ -48,6 +48,7 @@ Currently, the plugin implements the following features, so far:
- [X] Prison Gangs ** - [X] Prison Gangs **
- [X] Additional Gang Commands (kick, promote, disband) ** - [X] Additional Gang Commands (kick, promote, disband) **
- [X] Tree Farm ** - [X] Tree Farm **
- [x] Gang PlaceholderAPI support (display Gang Name for chat etc)
- [ ] Spawn with Prisoner Tools (Toggable) - [ ] Spawn with Prisoner Tools (Toggable)
- [ ] Restrict Prisoner Tools from moving in inventory and dropping? (Toggable) - [ ] Restrict Prisoner Tools from moving in inventory and dropping? (Toggable)
- [ ] Prisoner Tokens or Gems (Tied into Vault?)\ - [ ] Prisoner Tokens or Gems (Tied into Vault?)\

17
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>me.NVus</groupId> <groupId>me.NVus</groupId>
<artifactId>NVus_Prison</artifactId> <artifactId>NVus_Prison</artifactId>
<version>0.9.5</version> <version>0.9.7</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>NVus_PrisonSetup</name> <name>NVus_PrisonSetup</name>
@ -96,6 +96,11 @@
<id>enginehub</id> <id>enginehub</id>
<url>https://maven.enginehub.org/repo/</url> <url>https://maven.enginehub.org/repo/</url>
</repository> </repository>
<!-- PlaceholderAPI-->
<repository>
<id>placeholderapi</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
</repositories> </repositories>
<dependencyManagement> <dependencyManagement>
@ -123,18 +128,28 @@
<version>1.20.4-R0.1-SNAPSHOT</version> <version>1.20.4-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- PlaceholderAPI-->
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.11.4</version>
<scope>provided</scope>
</dependency>
<!-- WorldGuard-->
<dependency> <dependency>
<groupId>com.sk89q.worldguard</groupId> <groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId> <artifactId>worldguard-bukkit</artifactId>
<version>7.0.3</version> <version>7.0.3</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- WorldEdit-->
<dependency> <dependency>
<groupId>com.sk89q.worldedit</groupId> <groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId> <artifactId>worldedit-bukkit</artifactId>
<version>7.3.0</version> <!-- Use the correct version --> <version>7.3.0</version> <!-- Use the correct version -->
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- FastAsyncWorldEdit-->
<dependency> <dependency>
<groupId>com.fastasyncworldedit</groupId> <groupId>com.fastasyncworldedit</groupId>
<artifactId>FastAsyncWorldEdit-Core</artifactId> <artifactId>FastAsyncWorldEdit-Core</artifactId>

View File

@ -82,25 +82,64 @@ public class DatabaseManager {
initializeDatabase(); initializeDatabase();
} }
public void createGang(String name, String ownerUuid) { public void createGang(String name, String ownerUuid, String ownerName) {
String sql = "INSERT INTO nvus_gangs(name, owner_uuid) VALUES(?,?)"; 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(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)) { PreparedStatement insertGangStmt = conn.prepareStatement(insertGangSQL, Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, name); PreparedStatement insertMemberStmt = conn.prepareStatement(insertMemberSQL)) {
pstmt.setString(2, ownerUuid);
pstmt.executeUpdate(); // 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) { } 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) { 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 " + "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 = ? " + "WHERE g.name = ? " +
"GROUP BY g.name"; "GROUP BY g.name, g.owner_uuid";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(gangInfoQuery)) { PreparedStatement pstmt = conn.prepareStatement(gangInfoQuery)) {
@ -121,6 +160,7 @@ public class DatabaseManager {
public boolean removeGang(String gangName) { public boolean removeGang(String gangName) {
String sql = "DELETE FROM nvus_gangs WHERE name = ?"; String sql = "DELETE FROM nvus_gangs WHERE name = ?";

View File

@ -50,8 +50,8 @@ public class GangCommands implements CommandExecutor {
return handleGangKick(sender, args); return handleGangKick(sender, args);
case "disband": case "disband":
return handleGangDisband(sender, args); return handleGangDisband(sender, args);
case "list": case "info":
return handleGangList(sender, args); return handleGangInfo(sender, args);
default: default:
player.sendMessage(ChatColor.RED + "Invalid gang command. Use /gang help for a list of commands."); player.sendMessage(ChatColor.RED + "Invalid gang command. Use /gang help for a list of commands.");
return true; return true;
@ -202,7 +202,7 @@ public class GangCommands implements CommandExecutor {
message.append(ChatColor.LIGHT_PURPLE).append("NVus Prison Gangs:\n"); message.append(ChatColor.LIGHT_PURPLE).append("NVus Prison Gangs:\n");
message.append(ChatColor.DARK_GRAY).append("=======\n"); message.append(ChatColor.DARK_GRAY).append("=======\n");
message.append(ChatColor.GREEN).append("/gang create <name/tag> - Use this to create a gang.\n"); message.append(ChatColor.GREEN).append("/gang create <name/tag> - 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 <player> - Invite player to your gang.\n"); message.append(ChatColor.GREEN).append("/gang invite <player> - Invite player to your gang.\n");
message.append(ChatColor.GREEN).append("\n"); message.append(ChatColor.GREEN).append("\n");
message.append(ChatColor.GREEN).append("/gang accept - Accept an invite to a gang.\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; return true;
} }
// Check if exactly two arguments are provided (/gang create <name>)
if (args.length != 2) { if (args.length != 2) {
player.sendMessage(ChatColor.RED + "Usage: /gang create <gangName>"); player.sendMessage(ChatColor.RED + "Usage: /gang create <gangName>");
return true; return true;
@ -232,6 +233,18 @@ public class GangCommands implements CommandExecutor {
String gangName = args[1]; 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 // Check if the player already belongs to a gang
String currentGang = gangManager.getCurrentGangName(player.getUniqueId()); String currentGang = gangManager.getCurrentGangName(player.getUniqueId());
if (currentGang != null) { if (currentGang != null) {
@ -249,6 +262,7 @@ public class GangCommands implements CommandExecutor {
} }
private boolean handleGangInvite(CommandSender sender, String[] args) { private boolean handleGangInvite(CommandSender sender, String[] args) {
if (args.length != 3) { if (args.length != 3) {
sender.sendMessage("Usage: /nvus gang invite <playerName> <gangName>"); sender.sendMessage("Usage: /nvus gang invite <playerName> <gangName>");
@ -317,7 +331,7 @@ public class GangCommands implements CommandExecutor {
return true; return true;
} }
private boolean handleGangList(CommandSender sender, String[] args) { private boolean handleGangInfo(CommandSender sender, String[] args) {
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
sender.sendMessage("This command can only be used by players."); sender.sendMessage("This command can only be used by players.");
return true; return true;
@ -327,7 +341,7 @@ public class GangCommands implements CommandExecutor {
String gangName = gangManager.getCurrentGangName(player.getUniqueId()); String gangName = gangManager.getCurrentGangName(player.getUniqueId());
if (gangName == null) { 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; return true;
} }

View File

@ -53,8 +53,10 @@ public class GangManager {
} }
public boolean createGang(String gangName, Player owner) { public boolean createGang(String gangName, Player owner) {
if (dbManager.getGangIdByName(gangName) != null) return false; if (dbManager.getGangIdByName(gangName) != null) {
dbManager.createGang(gangName, owner.getUniqueId().toString()); return false; // Gang already exists
}
dbManager.createGang(gangName, owner.getUniqueId().toString(), owner.getName());
return true; return true;
} }

View File

@ -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;
}
}

View File

@ -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.PlayerSpawn;
import me.nvus.nvus_prison_setup.Listeners.BlockListener; import me.nvus.nvus_prison_setup.Listeners.BlockListener;
import me.nvus.nvus_prison_setup.Listeners.ToolSwitchListener; 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.Updater.UpdateChecker;
import me.nvus.nvus_prison_setup.Listeners.ToolDamageListener; import me.nvus.nvus_prison_setup.Listeners.ToolDamageListener;
import me.nvus.nvus_prison_setup.TreeFarm.TreeFarmListener; import me.nvus.nvus_prison_setup.TreeFarm.TreeFarmListener;
@ -75,6 +76,10 @@ public final class PrisonSetup extends JavaPlugin {
// Gang Related... GANG, GANG #LOLOLOLOL // Gang Related... GANG, GANG #LOLOLOLOL
this.getCommand("gang").setExecutor(new GangCommands(dbManager)); // Now correctly using initialized dbManager 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 // Settings Menu
getServer().getPluginManager().registerEvents(new SettingsMenu(this, configManager), this); getServer().getPluginManager().registerEvents(new SettingsMenu(this, configManager), this);

View File

@ -10,6 +10,7 @@ depend:
- WorldGuard - WorldGuard
softdepend: softdepend:
- PlaceholderAPI
- WorldEdit - WorldEdit
- FastAsyncWorldEdit - FastAsyncWorldEdit
@ -31,7 +32,7 @@ commands:
description: Base command for gang-related actions. description: Base command for gang-related actions.
usage: | usage: |
/gang create <name/tag> - Create a gang. /gang create <name/tag> - Create a gang.
/gang list - View your Gang info. /gang info - View your current Gangs info.
/gang invite <player> - Invite a player to your gang. /gang invite <player> - Invite a player to your gang.
/gang accept - Accept a Gang Invite. /gang accept - Accept a Gang Invite.
/gang deny - Decline a Gang Invite. /gang deny - Decline a Gang Invite.