From 88d48180627d8518030ae796e2d5582049e567e5 Mon Sep 17 00:00:00 2001 From: WildInterloper <156627888+WildInterloper@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:22:55 -0400 Subject: [PATCH] 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. --- README.MD | 13 ++- pom.xml | 10 +- .../Configs/ConfigManager.java | 8 ++ .../Database/DatabaseManager.java | 78 ++++++++++----- .../nvus_prison_setup/Gangs/GangCommands.java | 38 ++++++- .../nvus_prison_setup/Gangs/GangInfo.java | 27 +++++ .../nvus_prison_setup/Gangs/GangManager.java | 7 ++ .../nvus/nvus_prison_setup/PrisonSetup.java | 21 +++- .../TreeFarm/TreeFarmListener.java | 36 +++++++ .../TreeFarm/TreeFarmManager.java | 98 +++++++++++++++++++ .../nvus_prison_setup/TreeFarm/TreeType.java | 38 +++++++ src/main/resources/config.yml | 43 +++++++- src/main/resources/plugin.yml | 9 +- 13 files changed, 384 insertions(+), 42 deletions(-) create mode 100644 src/main/java/me/nvus/nvus_prison_setup/Gangs/GangInfo.java create mode 100644 src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeFarmListener.java create mode 100644 src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeFarmManager.java create mode 100644 src/main/java/me/nvus/nvus_prison_setup/TreeFarm/TreeType.java 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.