v0.9.5 - Iterated through a few versions locally fixing some database and gang issues. Implemented a new gang command /gang list to list info about a players current gang. The gang name, gang owner and how many members are in the gang etc.

This commit is contained in:
WildInterloper 2024-03-12 11:22:55 -04:00
parent 5db131ccab
commit 88d4818062
13 changed files with 384 additions and 42 deletions

View File

@ -43,8 +43,13 @@ Currently, the plugin implements the following features, so far:
## Upcoming Features: ## Upcoming Features:
- [X] GUI Menu - [X] GUI Menu
- [X] Toggle Prisoner Tool Damage - [X] Prevent Prisoner Tool Damage (Toggable)
- [ ] Prison Gangs - [X] Setup SQLite/MySQL Database Connections & Configuration
- [ ] Additional Gang Commands (kick, promote, disband) - [X] Prison Gangs **
- [ ] Tree Farm - [X] Additional Gang Commands (kick, promote, disband) **
- [X] Tree Farm **
- [ ] Spawn with Prisoner Tools (Toggable)
- [ ] Restrict Prisoner Tools from moving in inventory and dropping? (Toggable)
- [ ] Prisoner Tokens or Gems (Tied into Vault?)\
** Implemented but still WIP

10
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.1</version> <version>0.9.5</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>NVus_PrisonSetup</name> <name>NVus_PrisonSetup</name>
@ -126,7 +126,13 @@
<dependency> <dependency>
<groupId>com.sk89q.worldguard</groupId> <groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId> <artifactId>worldguard-bukkit</artifactId>
<version>7.0.9</version> <version>7.0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId>
<version>7.3.0</version> <!-- Use the correct version -->
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -37,6 +37,14 @@ public class ConfigManager {
return configs.get(configName); return configs.get(configName);
} }
public boolean getBoolean(String configName, String path, boolean defaultValue) {
FileConfiguration config = getConfig(configName);
if (config == null) {
return defaultValue;
}
return config.getBoolean(path, defaultValue);
}
public void saveConfig(String configName) { public void saveConfig(String configName) {
FileConfiguration config = getConfig(configName); FileConfiguration config = getConfig(configName);
File configFile = getConfigFile(configName); File configFile = getConfigFile(configName);

View File

@ -8,8 +8,12 @@ import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.util.UUID; import java.util.UUID;
import java.io.File; import java.io.File;
import me.nvus.nvus_prison_setup.Gangs.GangInfo;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import me.nvus.nvus_prison_setup.Configs.ConfigManager; import me.nvus.nvus_prison_setup.Configs.ConfigManager;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class DatabaseManager { public class DatabaseManager {
private ConfigManager configManager; private ConfigManager configManager;
@ -21,44 +25,45 @@ public class DatabaseManager {
setupDatabase(); setupDatabase();
} }
private void setupDatabase() { private void setupDatabase() {
FileConfiguration config = configManager.getConfig("config.yml"); FileConfiguration config = configManager.getConfig("config.yml");
this.databaseType = config.getString("Database.Type", "MySQL"); this.databaseType = config.getString("Database.Type", "MySQL");
String host = config.getString("host", "localhost");
int port = config.getInt("port", 3306);
String database = config.getString("database", "nvus_prison");
String username = URLEncoder.encode(config.getString("username", "username"), StandardCharsets.UTF_8);
String password = URLEncoder.encode(config.getString("password", "password"), StandardCharsets.UTF_8);
if ("SQLite".equalsIgnoreCase(databaseType)) { if ("SQLite".equalsIgnoreCase(databaseType)) {
File dbFile = new File(configManager.getDataFolder(), "nvus_prison.db"); File dbFile = new File(configManager.getDataFolder(), "nvus_prison.db");
this.url = "jdbc:sqlite:" + dbFile.getAbsolutePath(); this.url = "jdbc:sqlite:" + dbFile.getAbsolutePath();
} else { } else {
// Default to MySQL
String host = config.getString("host", "localhost");
int port = config.getInt("port", 3306);
String database = config.getString("database", "nvus_prison");
String username = config.getString("username", "root");
String password = config.getString("password", "");
this.url = "jdbc:mysql://" + host + ":" + port + "/" + database + "?user=" + username + "&password=" + password; this.url = "jdbc:mysql://" + host + ":" + port + "/" + database + "?user=" + username + "&password=" + password;
} }
// Attempt to initialize the database structure
initializeDatabase(); initializeDatabase();
} }
private Connection connect() throws SQLException { private Connection connect() throws SQLException {
return DriverManager.getConnection(url); return DriverManager.getConnection(url);
} }
private void initializeDatabase() { private void initializeDatabase() {
String sqlGangs = "CREATE TABLE IF NOT EXISTS gangs (" String sqlGangs = "CREATE TABLE IF NOT EXISTS nvus_gangs ("
+ "id INTEGER PRIMARY KEY " + (databaseType.equalsIgnoreCase("SQLite") ? "AUTOINCREMENT" : "AUTO_INCREMENT") + "," + "id INTEGER PRIMARY KEY " + (databaseType.equalsIgnoreCase("SQLite") ? "AUTOINCREMENT" : "AUTO_INCREMENT") + ","
+ "name TEXT NOT NULL," + "name TEXT NOT NULL,"
+ "owner_uuid TEXT NOT NULL" + "owner_uuid VARCHAR(36) NOT NULL"
+ ");"; + ");";
String sqlMembers = "CREATE TABLE IF NOT EXISTS members (" String sqlMembers = "CREATE TABLE IF NOT EXISTS nvus_gangs_members ("
+ "uuid TEXT PRIMARY KEY," + "uuid VARCHAR(36) PRIMARY KEY,"
+ "username TEXT NOT NULL," + "username TEXT NOT NULL,"
+ "gang_id INTEGER NOT NULL," + "gang_id INTEGER NOT NULL,"
+ "rank TEXT NOT NULL," + "rank TEXT NOT NULL,"
+ "FOREIGN KEY (gang_id) REFERENCES gangs(id)" + "FOREIGN KEY (gang_id) REFERENCES nvus_gangs(id)"
+ ");"; + ");";
try (Connection conn = connect(); Statement stmt = conn.createStatement()) { try (Connection conn = connect(); Statement stmt = conn.createStatement()) {
@ -71,13 +76,14 @@ public class DatabaseManager {
// Public Accessor to initialize the database // Public Accessor to initialize the database
public void initDatabase() { public void initDatabase() {
initializeDatabase(); initializeDatabase();
} }
public void createGang(String name, String ownerUuid) { public void createGang(String name, String ownerUuid) {
String sql = "INSERT INTO gangs(name, owner_uuid) VALUES(?,?)"; String sql = "INSERT INTO nvus_gangs(name, owner_uuid) VALUES(?,?)";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)) { PreparedStatement pstmt = conn.prepareStatement(sql)) {
@ -89,8 +95,34 @@ public class DatabaseManager {
} }
} }
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 " +
"FROM nvus_gangs g " +
"LEFT JOIN nvus_gangs_members m ON g.id = m.gang_id " +
"WHERE g.name = ? " +
"GROUP BY g.name";
try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(gangInfoQuery)) {
pstmt.setString(1, gangName);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
String name = rs.getString("name");
String ownerName = rs.getString("ownerName");
int memberCount = rs.getInt("memberCount");
return new GangInfo(name, ownerName, memberCount);
}
}
} catch (SQLException e) {
System.out.println("Error fetching gang info: " + e.getMessage());
}
return null; // Return null if gang info could not be retrieved
}
public boolean removeGang(String gangName) { public boolean removeGang(String gangName) {
String sql = "DELETE FROM gangs WHERE name = ?"; String sql = "DELETE FROM nvus_gangs WHERE name = ?";
try (Connection conn = this.connect(); PreparedStatement pstmt = conn.prepareStatement(sql)) { try (Connection conn = this.connect(); PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, gangName); pstmt.setString(1, gangName);
@ -103,7 +135,7 @@ public class DatabaseManager {
} }
public boolean addMember(String uuid, String username, int gangId, String rank) { public boolean addMember(String uuid, String username, int gangId, String rank) {
String sql = "INSERT INTO members(uuid, username, gang_id, rank) VALUES(?,?,?,?)"; String sql = "INSERT INTO nvus_gangs_members(uuid, username, gang_id, rank) VALUES(?,?,?,?)";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)) { PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, uuid); pstmt.setString(1, uuid);
@ -119,7 +151,7 @@ public class DatabaseManager {
} }
public Integer getGangIdByName(String name) { public Integer getGangIdByName(String name) {
String sql = "SELECT id FROM gangs WHERE name = ?"; String sql = "SELECT id FROM nvus_gangs WHERE name = ?";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)){ PreparedStatement pstmt = conn.prepareStatement(sql)){
@ -138,7 +170,7 @@ public class DatabaseManager {
} }
public Integer getGangIdByOwnerUuid(String ownerUuid) { public Integer getGangIdByOwnerUuid(String ownerUuid) {
String sql = "SELECT id FROM gangs WHERE owner_uuid = ?"; String sql = "SELECT id FROM nvus_gangs WHERE owner_uuid = ?";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)){ PreparedStatement pstmt = conn.prepareStatement(sql)){
@ -157,7 +189,7 @@ public class DatabaseManager {
} }
public String getCurrentGangByPlayerUuid(UUID playerUuid) { public String getCurrentGangByPlayerUuid(UUID playerUuid) {
String sql = "SELECT g.name FROM gangs g INNER JOIN members m ON g.id = m.gang_id WHERE m.uuid = ?"; String sql = "SELECT g.name FROM nvus_gangs g INNER JOIN nvus_gangs_members m ON g.id = m.gang_id WHERE m.uuid = ?";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)) { PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, playerUuid.toString()); pstmt.setString(1, playerUuid.toString());
@ -177,7 +209,7 @@ public class DatabaseManager {
// Method to invite a player to a gang, limited to Gang Owner and Capo // Method to invite a player to a gang, limited to Gang Owner and Capo
public boolean canInvite(String playerUuid) { public boolean canInvite(String playerUuid) {
// Example implementation // Example implementation
String sql = "SELECT rank FROM members WHERE uuid = ?"; String sql = "SELECT rank FROM nvus_gangs_members WHERE uuid = ?";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)) { PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, playerUuid); pstmt.setString(1, playerUuid);
@ -208,7 +240,7 @@ public class DatabaseManager {
} }
public String getMemberRank(UUID playerUuid, String gangName) { public String getMemberRank(UUID playerUuid, String gangName) {
String sql = "SELECT m.rank FROM members m INNER JOIN gangs g ON m.gang_id = g.id WHERE m.uuid = ? AND g.name = ?"; String sql = "SELECT m.rank FROM nvus_gangs_members m INNER JOIN nvus_gangs g ON m.gang_id = g.id WHERE m.uuid = ? AND g.name = ?";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)) { PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, playerUuid.toString()); pstmt.setString(1, playerUuid.toString());
@ -224,7 +256,7 @@ public class DatabaseManager {
} }
public boolean updateMemberRank(UUID playerUuid, String gangName, String newRank) { public boolean updateMemberRank(UUID playerUuid, String gangName, String newRank) {
String sql = "UPDATE members SET rank = ? WHERE uuid = ? AND gang_id = (SELECT id FROM gangs WHERE name = ?)"; String sql = "UPDATE nvus_gangs_members SET rank = ? WHERE uuid = ? AND gang_id = (SELECT id FROM nvus_gangs WHERE name = ?)";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)) { PreparedStatement pstmt = conn.prepareStatement(sql)) {
@ -241,7 +273,7 @@ public class DatabaseManager {
} }
public boolean removeMember(UUID playerUuid, String gangName) { public boolean removeMember(UUID playerUuid, String gangName) {
String sql = "DELETE FROM members WHERE uuid = ? AND gang_id = (SELECT id FROM gangs WHERE name = ?)"; String sql = "DELETE FROM nvus_gangs_members WHERE uuid = ? AND gang_id = (SELECT id FROM nvus_gangs WHERE name = ?)";
try (Connection conn = this.connect(); try (Connection conn = this.connect();
PreparedStatement pstmt = conn.prepareStatement(sql)) { PreparedStatement pstmt = conn.prepareStatement(sql)) {
@ -257,7 +289,7 @@ public class DatabaseManager {
} }
public boolean removeMembersByGangId(int gangId) { public boolean removeMembersByGangId(int gangId) {
String sql = "DELETE FROM members WHERE gang_id = ?"; String sql = "DELETE FROM nvus_gangs_members WHERE gang_id = ?";
try (Connection conn = this.connect(); PreparedStatement pstmt = conn.prepareStatement(sql)) { try (Connection conn = this.connect(); PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, gangId); pstmt.setInt(1, gangId);

View File

@ -50,6 +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":
return handleGangList(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;
@ -200,16 +202,16 @@ 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 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("/gang accept - Accept an invite to a gang.\n"); message.append(ChatColor.GREEN).append("/gang accept - Accept an invite to a gang.\n");
message.append(ChatColor.GREEN).append("/gang deny - Deny an invite to a gang.\n"); message.append(ChatColor.GREEN).append("/gang deny - Deny an invite to a gang.\n");
message.append(ChatColor.GREEN).append("/gang leave - Leave your current gang.\n"); message.append(ChatColor.GREEN).append("/gang leave - Leave your current gang.\n");
message.append(ChatColor.GREEN).append("\n"); message.append(ChatColor.GREEN).append("\n");
message.append(ChatColor.YELLOW).append("COMING SOON:\n");
message.append(ChatColor.YELLOW).append("=============\n");
message.append(ChatColor.GREEN).append("/gang disband - Delete/Remove your gang.\n");
message.append(ChatColor.GREEN).append("/gang promote <player> - Promote a gang member to a higher rank.\n"); message.append(ChatColor.GREEN).append("/gang promote <player> - Promote a gang member to a higher rank.\n");
message.append(ChatColor.GREEN).append("/gang kick <player> - Kick a member from your gang.\n"); message.append(ChatColor.GREEN).append("/gang kick <player> - Kick a member from your gang.\n");
message.append(ChatColor.GREEN).append("/gang disband - Delete/Remove your gang.\n");
message.append(ChatColor.GREEN).append("\n"); message.append(ChatColor.GREEN).append("\n");
player.sendMessage(message.toString()); player.sendMessage(message.toString());
@ -314,4 +316,34 @@ public class GangCommands implements CommandExecutor {
} }
return true; return true;
} }
private boolean handleGangList(CommandSender sender, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("This command can only be used by players.");
return true;
}
Player player = (Player) sender;
String gangName = gangManager.getCurrentGangName(player.getUniqueId());
if (gangName == null) {
player.sendMessage("You are not in a gang.");
return true;
}
// Assuming we have a method in GangManager to get detailed info
GangInfo gangInfo = gangManager.getGangInfo(gangName);
if (gangInfo == null) {
player.sendMessage("Gang information could not be retrieved.");
return true;
}
player.sendMessage(ChatColor.GREEN + "Gang Name: " + ChatColor.WHITE + gangInfo.getName());
player.sendMessage(ChatColor.GREEN + "Gang Owner: " + ChatColor.WHITE + gangInfo.getOwnerName());
player.sendMessage(ChatColor.GREEN + "Total Members: " + ChatColor.WHITE + gangInfo.getMemberCount());
return true;
}
} }

View File

@ -0,0 +1,27 @@
package me.nvus.nvus_prison_setup.Gangs;
public class GangInfo {
private String name;
private String ownerName;
private int memberCount;
// Constructor
public GangInfo(String name, String ownerName, int memberCount) {
this.name = name;
this.ownerName = ownerName;
this.memberCount = memberCount;
}
// Getters
public String getName() {
return name;
}
public String getOwnerName() {
return ownerName;
}
public int getMemberCount() {
return memberCount;
}
}

View File

@ -2,6 +2,7 @@ package me.nvus.nvus_prison_setup.Gangs;
import java.util.UUID; import java.util.UUID;
import me.nvus.nvus_prison_setup.Database.DatabaseManager; import me.nvus.nvus_prison_setup.Database.DatabaseManager;
import me.nvus.nvus_prison_setup.Gangs.GangInfo;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -18,6 +19,12 @@ public class GangManager {
MEMBER MEMBER
} }
public GangInfo getGangInfo(String gangName) {
// Fetch gang information from the database through DatabaseManager
return dbManager.getGangInfo(gangName);
}
// Assuming a simplified model where the next rank is simply the next ordinal in the enum // Assuming a simplified model where the next rank is simply the next ordinal in the enum
public String getNextRank(String currentRank) { public String getNextRank(String currentRank) {
try { try {

View File

@ -11,12 +11,16 @@ 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.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;
// Database // Database
import me.nvus.nvus_prison_setup.Database.DatabaseManager; import me.nvus.nvus_prison_setup.Database.DatabaseManager;
// Gangs // Gangs
import me.nvus.nvus_prison_setup.Gangs.GangCommands; import me.nvus.nvus_prison_setup.Gangs.GangCommands;
import me.nvus.nvus_prison_setup.Gangs.GangManager; import me.nvus.nvus_prison_setup.Gangs.GangManager;
// Bukkit
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@ -32,10 +36,10 @@ public final class PrisonSetup extends JavaPlugin {
private ConfigManager configManager; private ConfigManager configManager;
private DatabaseManager dbManager; private DatabaseManager dbManager;
private GangManager gangManager; // Added reference to GangManager private GangManager gangManager; // Added reference to GangManager
// Initialize the DatabaseManager
@Override @Override
public void onEnable() { public void onEnable() {
// Initialize the ConfigManager // Initialize the ConfigManager
configManager = new ConfigManager(this); configManager = new ConfigManager(this);
@ -49,7 +53,7 @@ public final class PrisonSetup extends JavaPlugin {
File databaseFile = new File(getDataFolder(), "nvus_prison.db"); File databaseFile = new File(getDataFolder(), "nvus_prison.db");
if (!databaseFile.exists()) { if (!databaseFile.exists()) {
dbManager.initDatabase(); // Correct use of dbManager after initialization dbManager.initDatabase(); // Correct use of dbManager after initialization
getLogger().info("SQLite database initialized successfully."); getLogger().info("Database initialized successfully.");
} else { } else {
getLogger().info("SQLite database already exists."); getLogger().info("SQLite database already exists.");
} }
@ -59,6 +63,8 @@ public final class PrisonSetup extends JavaPlugin {
configManager.saveDefaultConfig("banned_items.yml"); configManager.saveDefaultConfig("banned_items.yml");
configManager.saveDefaultConfig("auto_switch.yml"); configManager.saveDefaultConfig("auto_switch.yml");
//FileConfiguration config = configManager.getConfig("config.yml");
// Register Event Listeners // Register Event Listeners
getServer().getPluginManager().registerEvents(new PlayerSpawn(configManager), this); getServer().getPluginManager().registerEvents(new PlayerSpawn(configManager), this);
getServer().getPluginManager().registerEvents(new PlayerArmor(configManager), this); getServer().getPluginManager().registerEvents(new PlayerArmor(configManager), this);
@ -77,6 +83,11 @@ public final class PrisonSetup extends JavaPlugin {
ToolDamageListener toolDamageListener = new ToolDamageListener(configManager); ToolDamageListener toolDamageListener = new ToolDamageListener(configManager);
getServer().getPluginManager().registerEvents(toolDamageListener, this); getServer().getPluginManager().registerEvents(toolDamageListener, this);
// TreeFarm Boolean Check
if (configManager.getBoolean("config.yml", "TreeFarm", false)) {
getServer().getPluginManager().registerEvents(new TreeFarmListener(this), this);
}
// Successful Startup/Enable // Successful Startup/Enable
getLogger().info(ChatColor.translateAlternateColorCodes('&',"&a&lNVus Prison Setup has been successfully enabled!")); getLogger().info(ChatColor.translateAlternateColorCodes('&',"&a&lNVus Prison Setup has been successfully enabled!"));
@ -102,9 +113,9 @@ public final class PrisonSetup extends JavaPlugin {
@Override @Override
public void onDisable() { public void onDisable() {
// Save the config when disabling the plugin // Save the config when disabling the plugin
configManager.saveConfig("config.yml"); // configManager.saveConfig("config.yml");
configManager.saveConfig("banned_items.yml"); // configManager.saveConfig("banned_items.yml");
configManager.saveConfig("auto_switch.yml"); // configManager.saveConfig("auto_switch.yml");
// Log a success message // Log a success message
getLogger().info(ChatColor.translateAlternateColorCodes('&',"&c&lNVus Prison Setup has been successfully disabled!")); getLogger().info(ChatColor.translateAlternateColorCodes('&',"&c&lNVus Prison Setup has been successfully disabled!"));

View File

@ -0,0 +1,36 @@
package me.nvus.nvus_prison_setup.TreeFarm;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import me.nvus.nvus_prison_setup.PrisonSetup;
public class TreeFarmListener implements Listener {
private PrisonSetup plugin;
// Constructor that accepts the main plugin instance
public TreeFarmListener(PrisonSetup plugin) {
this.plugin = plugin;
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
// Check if the block being broken is a log
if (TreeType.isLog(block.getType())) {
// Get the block directly beneath the log block
Block blockBelow = block.getRelative(0, -1, 0);
// Check if the block below is either grass or dirt, indicating this could be the base of a tree
if (blockBelow.getType() == Material.GRASS_BLOCK || blockBelow.getType() == Material.DIRT) {
// Check if the player has the required permission
if (event.getPlayer().hasPermission("nvus.prisoner")) {
event.setCancelled(true); // Cancel the event to handle block breaking manually
TreeFarmManager.breakTree(block, event.getPlayer(), plugin);
}
}
}
}
}

View File

@ -0,0 +1,98 @@
package me.nvus.nvus_prison_setup.TreeFarm;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
public class TreeFarmManager {
public static void breakTree(Block block, Player player, Plugin plugin) {
if (!TreeType.isLog(block.getType())) return; // Early exit if not a log
// Determine the tree type from the block
TreeType treeType = getTreeTypeByLog(block.getType());
if (treeType == null) return; // Early exit if tree type is not recognized
// Break the tree starting from the bottom block
Block currentBlock = block;
while (currentBlock != null && treeType.isLog(currentBlock.getType())) {
// Add the log to the player's inventory
player.getInventory().addItem(new ItemStack(currentBlock.getType(), 1));
currentBlock.setType(Material.AIR); // Remove the log block
currentBlock = currentBlock.getRelative(0, 1, 0); // Move up
}
// Replace the base of the tree with a sapling
block.setType(treeType.getSaplingMaterial());
// Collect any disconnected logs
collectDisconnectedLogs(block, player, plugin);
}
private static TreeType getTreeTypeByLog(Material logMaterial) {
for (TreeType treeType : TreeType.values()) {
if (treeType.getLogMaterial() == logMaterial) {
return treeType;
}
}
return null; // Return null if no matching TreeType is found
}
public static void collectDisconnectedLogs(Block startBlock, Player player, Plugin plugin) {
Set<Block> checkedBlocks = new HashSet<>();
Queue<Block> toCheck = new LinkedList<>();
toCheck.add(startBlock);
while (!toCheck.isEmpty()) {
Block block = toCheck.poll();
if (!checkedBlocks.add(block)) continue; // Skip if already checked
if (TreeType.isLog(block.getType())) {
// Add the log to the player's inventory and remove it
player.getInventory().addItem(new ItemStack(block.getType(), 1));
block.setType(Material.AIR);
// Check surrounding blocks
for (int x = -1; x <= 1; x++) {
for (int y = -1; y <= 1; y++) {
for (int z = -1; z <= 1; z++) {
Block relative = block.getRelative(x, y, z);
if (TreeType.isLog(relative.getType()) && !checkedBlocks.contains(relative)) {
toCheck.add(relative);
}
}
}
}
}
}
}
public static void accelerateLeafDecay(Block startBlock, Plugin plugin) {
Bukkit.getScheduler().runTaskLater(plugin, () -> {
for (int x = -5; x <= 5; x++) {
for (int y = -5; y <= 5; y++) {
for (int z = -5; z <= 5; z++) {
Block block = startBlock.getRelative(x, y, z);
if (block.getType() == Material.OAK_LEAVES || block.getType() == Material.SPRUCE_LEAVES // Add other leaf types
) {
block.breakNaturally();
}
}
}
}
}, 20L); // Based on 20TPS
}
}

View File

@ -0,0 +1,38 @@
package me.nvus.nvus_prison_setup.TreeFarm;
import org.bukkit.Material;
import java.util.EnumSet;
public enum TreeType {
OAK(Material.OAK_LOG, Material.OAK_SAPLING),
SPRUCE(Material.SPRUCE_LOG, Material.SPRUCE_SAPLING),
BIRCH(Material.BIRCH_LOG, Material.BIRCH_SAPLING),
JUNGLE(Material.JUNGLE_LOG, Material.JUNGLE_SAPLING),
ACACIA(Material.ACACIA_LOG, Material.ACACIA_SAPLING),
DARK_OAK(Material.DARK_OAK_LOG, Material.DARK_OAK_SAPLING);
private final Material logMaterial;
private final Material saplingMaterial;
TreeType(Material logMaterial, Material saplingMaterial) {
this.logMaterial = logMaterial;
this.saplingMaterial = saplingMaterial;
}
public Material getLogMaterial() {
return logMaterial;
}
public Material getSaplingMaterial() {
return saplingMaterial;
}
public static boolean isLog(Material material) {
for (TreeType treeType : TreeType.values()) {
if (treeType.getLogMaterial() == material) {
return true;
}
}
return false;
}
}

View File

@ -4,23 +4,40 @@
# www.FNGnation.net # # www.FNGnation.net #
# Discord: FNGnation.net/discord # # Discord: FNGnation.net/discord #
#======================================================================================# #======================================================================================#
# Remember to give prisoner ranks/groups the permission ' nvus.prisoner ' and negate that permission for any # Remember to give prisoner ranks/groups the permission ' nvus.prisoner ' and negate that permission for any
# players that are not or no longer considered a prisoner. # players that are not or no longer considered a prisoner.
########################################################################################
# AUTO PICKUP & SWITCH SETTINGS #
########################################################################################
# Should prisoners auto pickup blocks they have mined? # Should prisoners auto pickup blocks they have mined?
# Use /nvus autopickup true|false to toggle this in-game! (Requires permission: nvus.admin) # Use /nvus autopickup true|false to toggle this in-game! (Requires permission: nvus.admin)
# DO NOT TURN THIS ON WHEN RUNNING THIS PLUGIN ON A LIVE/PRODUCTION SERVER! There may be bugs! # Can also use /nvus menu for a GUI to toggle this and other features on/off!
# TEST THIS FEATURE HEAVILY before setting this to true on a live/production server! It does currently check if
# player has break permissions for the block they are mining, but it is still a work in progress.
# It checks WorldGuard if player is region owner, a member of region or if player has the WorldGuard bypass permission etc.
AutoPickup: false AutoPickup: false
# Should prisoners be able to auto switch to the correct tool for whatever they are mining? # Should prisoners be able to auto switch to the correct tool for whatever they are mining?
#i.e. If hitting dirt/clay with a pickaxe, they will auto switch to a shovel (if in their quickbar) #i.e. If hitting dirt/clay with a pickaxe, they will auto switch to a shovel (if in their quickbar)
# Use /nvus autoswitch true|false to toggle this in-game! (Requires permission: nvus.admin) # Use /nvus autoswitch true|false to toggle this in-game! (Requires permission: nvus.admin)
AutoSwitch: true AutoSwitch: true
########################################################################################
# ARMOR SETTINGS #
########################################################################################
# Should prisoners be given a default prisoner armor set (orange leather armor) when they join the server? # Should prisoners be given a default prisoner armor set (orange leather armor) when they join the server?
PrisonerArmor: true PrisonerArmor: true
# Should prisoners be able to remove/change their default prisoner armor? # Should prisoners be able to remove/change their default prisoner armor?
RestrictArmor: true RestrictArmor: true
########################################################################################
# PRISONER TOOL SETTINGS #
########################################################################################
# What tools are considered Prisoner Tools? These are used for the ToolDamage toggle and for auto switching feature! # What tools are considered Prisoner Tools? These are used for the ToolDamage toggle and for auto switching feature!
# See auto_switch.yml to set up which blocks trigger the auto switch to these tools. # See auto_switch.yml to set up which blocks trigger the auto switch to these tools.
PrisonerTools: PrisonerTools:
@ -30,12 +47,32 @@ PrisonerTools:
# When set to FALSE it will prevent Prisoner Tools from receiving damage when mining etc. # When set to FALSE it will prevent Prisoner Tools from receiving damage when mining etc.
ToolDamage: false ToolDamage: false
########################################################################################
# TREE FARM FEATURE #
########################################################################################
# Do you want the TreeFarm features to be enabled? Players with nvus.prisoner permission will be able to use this feature.
# Hitting the bottom block of any tree will destroy the tree and place the logs in the players inventory.
# It will then place down a sapling in the same spot where the tree base was destroyed.
TreeFarm: true
########################################################################################
# DATABASE SETTINGS #
########################################################################################
# Database Settings # Database Settings
# MySQL or SQLite (local) # Type can be either MySQL or SQLite (local)
Database.Type: MySQL Database.Type: SQLite
# The following is only needed if using MySQL
host: 0.0.0.0 host: 0.0.0.0
port: 3306 port: 3306
database: nvus_prison database: nvus_prison
username: username username: username
password: password password: password
########################################################################################
# DO NOT TOUCH #
########################################################################################
ConfigVersion: 1.1 # Do not touch this! It can and probably will break the plugin if you do!

View File

@ -6,9 +6,13 @@ prefix: NVus Prison
authors: [never2nv] authors: [never2nv]
website: https://FNGnation.net website: https://FNGnation.net
depends: depend:
- WorldGuard - WorldGuard
softdepend:
- WorldEdit
- FastAsyncWorldEdit
commands: commands:
nvus: nvus:
description: Base command to view NVus Prison Setup commands. description: Base command to view NVus Prison Setup commands.
@ -26,7 +30,8 @@ commands:
gang: gang:
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 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.