diff --git a/README.MD b/README.MD
index 671f813..897cb55 100644
--- a/README.MD
+++ b/README.MD
@@ -43,8 +43,13 @@ Currently, the plugin implements the following features, so far:
## Upcoming Features:
- [X] GUI Menu
- - [X] Toggle Prisoner Tool Damage
- - [ ] Prison Gangs
- - [ ] Additional Gang Commands (kick, promote, disband)
- - [ ] Tree Farm
+ - [X] Prevent Prisoner Tool Damage (Toggable)
+ - [X] Setup SQLite/MySQL Database Connections & Configuration
+ - [X] Prison Gangs **
+ - [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
diff --git a/pom.xml b/pom.xml
index e154a89..ed9fb2f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.NVus
NVus_Prison
- 0.9.1
+ 0.9.5
jar
NVus_PrisonSetup
@@ -126,7 +126,13 @@
com.sk89q.worldguard
worldguard-bukkit
- 7.0.9
+ 7.0.3
+ provided
+
+
+ com.sk89q.worldedit
+ worldedit-bukkit
+ 7.3.0
provided
diff --git a/src/main/java/me/nvus/nvus_prison_setup/Configs/ConfigManager.java b/src/main/java/me/nvus/nvus_prison_setup/Configs/ConfigManager.java
index 89328f8..3adbfb2 100644
--- a/src/main/java/me/nvus/nvus_prison_setup/Configs/ConfigManager.java
+++ b/src/main/java/me/nvus/nvus_prison_setup/Configs/ConfigManager.java
@@ -37,6 +37,14 @@ public class ConfigManager {
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) {
FileConfiguration config = getConfig(configName);
File configFile = getConfigFile(configName);
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 b53d9f3..30d2d6a 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
@@ -8,8 +8,12 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.util.UUID;
import java.io.File;
+
+import me.nvus.nvus_prison_setup.Gangs.GangInfo;
import org.bukkit.configuration.file.FileConfiguration;
import me.nvus.nvus_prison_setup.Configs.ConfigManager;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
public class DatabaseManager {
private ConfigManager configManager;
@@ -21,44 +25,45 @@ public class DatabaseManager {
setupDatabase();
}
+
private void setupDatabase() {
FileConfiguration config = configManager.getConfig("config.yml");
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)) {
File dbFile = new File(configManager.getDataFolder(), "nvus_prison.db");
this.url = "jdbc:sqlite:" + dbFile.getAbsolutePath();
} 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;
}
- // Attempt to initialize the database structure
initializeDatabase();
}
+
private Connection connect() throws SQLException {
return DriverManager.getConnection(url);
}
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") + ","
+ "name TEXT NOT NULL,"
- + "owner_uuid TEXT NOT NULL"
+ + "owner_uuid VARCHAR(36) NOT NULL"
+ ");";
- String sqlMembers = "CREATE TABLE IF NOT EXISTS members ("
- + "uuid TEXT PRIMARY KEY,"
+ String sqlMembers = "CREATE TABLE IF NOT EXISTS nvus_gangs_members ("
+ + "uuid VARCHAR(36) PRIMARY KEY,"
+ "username TEXT NOT NULL,"
+ "gang_id INTEGER 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()) {
@@ -71,13 +76,14 @@ public class DatabaseManager {
+
// Public Accessor to initialize the database
public void initDatabase() {
initializeDatabase();
}
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();
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) {
- 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)) {
pstmt.setString(1, gangName);
@@ -103,7 +135,7 @@ public class DatabaseManager {
}
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();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, uuid);
@@ -119,7 +151,7 @@ public class DatabaseManager {
}
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();
PreparedStatement pstmt = conn.prepareStatement(sql)){
@@ -138,7 +170,7 @@ public class DatabaseManager {
}
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();
PreparedStatement pstmt = conn.prepareStatement(sql)){
@@ -157,7 +189,7 @@ public class DatabaseManager {
}
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();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
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
public boolean canInvite(String playerUuid) {
// 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();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, playerUuid);
@@ -208,7 +240,7 @@ public class DatabaseManager {
}
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();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, playerUuid.toString());
@@ -224,7 +256,7 @@ public class DatabaseManager {
}
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();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
@@ -241,7 +273,7 @@ public class DatabaseManager {
}
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();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
@@ -257,7 +289,7 @@ public class DatabaseManager {
}
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)) {
pstmt.setInt(1, gangId);
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 86302a9..592d26c 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,6 +50,8 @@ public class GangCommands implements CommandExecutor {
return handleGangKick(sender, args);
case "disband":
return handleGangDisband(sender, args);
+ case "list":
+ return handleGangList(sender, args);
default:
player.sendMessage(ChatColor.RED + "Invalid gang command. Use /gang help for a list of commands.");
return true;
@@ -200,16 +202,16 @@ 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 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");
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("\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 - Promote a gang member to a higher rank.\n");
message.append(ChatColor.GREEN).append("/gang kick - 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");
player.sendMessage(message.toString());
@@ -314,4 +316,34 @@ public class GangCommands implements CommandExecutor {
}
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;
+ }
+
+
}
diff --git a/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangInfo.java b/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangInfo.java
new file mode 100644
index 0000000..b925b0c
--- /dev/null
+++ b/src/main/java/me/nvus/nvus_prison_setup/Gangs/GangInfo.java
@@ -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;
+ }
+}
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 2c8a54c..359d1bb 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
@@ -2,6 +2,7 @@ package me.nvus.nvus_prison_setup.Gangs;
import java.util.UUID;
import me.nvus.nvus_prison_setup.Database.DatabaseManager;
+import me.nvus.nvus_prison_setup.Gangs.GangInfo;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -18,6 +19,12 @@ public class GangManager {
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
public String getNextRank(String currentRank) {
try {
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 2d4c4b7..2e72272 100644
--- a/src/main/java/me/nvus/nvus_prison_setup/PrisonSetup.java
+++ b/src/main/java/me/nvus/nvus_prison_setup/PrisonSetup.java
@@ -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.Updater.UpdateChecker;
import me.nvus.nvus_prison_setup.Listeners.ToolDamageListener;
+import me.nvus.nvus_prison_setup.TreeFarm.TreeFarmListener;
// Database
import me.nvus.nvus_prison_setup.Database.DatabaseManager;
// Gangs
import me.nvus.nvus_prison_setup.Gangs.GangCommands;
import me.nvus.nvus_prison_setup.Gangs.GangManager;
+
+// Bukkit
import org.bukkit.Bukkit;
+import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;
@@ -32,10 +36,10 @@ public final class PrisonSetup extends JavaPlugin {
private ConfigManager configManager;
private DatabaseManager dbManager;
private GangManager gangManager; // Added reference to GangManager
- // Initialize the DatabaseManager
@Override
public void onEnable() {
+
// Initialize the ConfigManager
configManager = new ConfigManager(this);
@@ -49,7 +53,7 @@ public final class PrisonSetup extends JavaPlugin {
File databaseFile = new File(getDataFolder(), "nvus_prison.db");
if (!databaseFile.exists()) {
dbManager.initDatabase(); // Correct use of dbManager after initialization
- getLogger().info("SQLite database initialized successfully.");
+ getLogger().info("Database initialized successfully.");
} else {
getLogger().info("SQLite database already exists.");
}
@@ -59,6 +63,8 @@ public final class PrisonSetup extends JavaPlugin {
configManager.saveDefaultConfig("banned_items.yml");
configManager.saveDefaultConfig("auto_switch.yml");
+ //FileConfiguration config = configManager.getConfig("config.yml");
+
// Register Event Listeners
getServer().getPluginManager().registerEvents(new PlayerSpawn(configManager), this);
getServer().getPluginManager().registerEvents(new PlayerArmor(configManager), this);
@@ -77,6 +83,11 @@ public final class PrisonSetup extends JavaPlugin {
ToolDamageListener toolDamageListener = new ToolDamageListener(configManager);
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
getLogger().info(ChatColor.translateAlternateColorCodes('&',"&a&lNVus Prison Setup has been successfully enabled!"));
@@ -102,9 +113,9 @@ public final class PrisonSetup extends JavaPlugin {
@Override
public void onDisable() {
// Save the config when disabling the plugin
- configManager.saveConfig("config.yml");
- configManager.saveConfig("banned_items.yml");
- configManager.saveConfig("auto_switch.yml");
+// configManager.saveConfig("config.yml");
+// configManager.saveConfig("banned_items.yml");
+// configManager.saveConfig("auto_switch.yml");
// Log a success message
getLogger().info(ChatColor.translateAlternateColorCodes('&',"&c&lNVus Prison Setup has been successfully disabled!"));
diff --git a/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeFarmListener.java b/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeFarmListener.java
new file mode 100644
index 0000000..ef0e519
--- /dev/null
+++ b/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeFarmListener.java
@@ -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);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeFarmManager.java b/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeFarmManager.java
new file mode 100644
index 0000000..4356dd8
--- /dev/null
+++ b/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeFarmManager.java
@@ -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 checkedBlocks = new HashSet<>();
+ Queue 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
+ }
+
+
+}
+
diff --git a/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeType.java b/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeType.java
new file mode 100644
index 0000000..845b5f4
--- /dev/null
+++ b/src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeType.java
@@ -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;
+ }
+}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 030578d..e043cd6 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -4,23 +4,40 @@
# www.FNGnation.net #
# Discord: FNGnation.net/discord #
#======================================================================================#
+
# 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.
+########################################################################################
+# AUTO PICKUP & SWITCH SETTINGS #
+########################################################################################
+
# Should prisoners auto pickup blocks they have mined?
# 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
+
# 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)
# Use /nvus autoswitch true|false to toggle this in-game! (Requires permission: nvus.admin)
AutoSwitch: true
+########################################################################################
+# ARMOR SETTINGS #
+########################################################################################
+
# Should prisoners be given a default prisoner armor set (orange leather armor) when they join the server?
PrisonerArmor: true
# Should prisoners be able to remove/change their default prisoner armor?
RestrictArmor: true
+########################################################################################
+# PRISONER TOOL SETTINGS #
+########################################################################################
+
# 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.
PrisonerTools:
@@ -30,12 +47,32 @@ PrisonerTools:
# When set to FALSE it will prevent Prisoner Tools from receiving damage when mining etc.
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
-# MySQL or SQLite (local)
-Database.Type: MySQL
+# Type can be either MySQL or SQLite (local)
+Database.Type: SQLite
+# The following is only needed if using MySQL
host: 0.0.0.0
port: 3306
database: nvus_prison
username: username
password: password
+
+########################################################################################
+# DO NOT TOUCH #
+########################################################################################
+
+ConfigVersion: 1.1 # Do not touch this! It can and probably will break the plugin if you do!
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 7a5c8c3..d132d6e 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -6,9 +6,13 @@ prefix: NVus Prison
authors: [never2nv]
website: https://FNGnation.net
-depends:
+depend:
- WorldGuard
+softdepend:
+ - WorldEdit
+ - FastAsyncWorldEdit
+
commands:
nvus:
description: Base command to view NVus Prison Setup commands.
@@ -26,7 +30,8 @@ commands:
gang:
description: Base command for gang-related actions.
usage: |
- /gang create - Create a gang
+ /gang create - Create a gang.
+ /gang list - View your Gang info.
/gang invite - Invite a player to your gang.
/gang accept - Accept a Gang Invite.
/gang deny - Decline a Gang Invite.