forked from never2nv/NVus_Prison
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:
parent
5db131ccab
commit
88d4818062
13
README.MD
13
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
|
||||
|
||||
|
|
10
pom.xml
10
pom.xml
|
@ -6,7 +6,7 @@
|
|||
|
||||
<groupId>me.NVus</groupId>
|
||||
<artifactId>NVus_Prison</artifactId>
|
||||
<version>0.9.1</version>
|
||||
<version>0.9.5</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>NVus_PrisonSetup</name>
|
||||
|
@ -126,7 +126,13 @@
|
|||
<dependency>
|
||||
<groupId>com.sk89q.worldguard</groupId>
|
||||
<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>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 <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("\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 <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 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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!"));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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!
|
||||
|
|
|
@ -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 <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 accept - Accept a Gang Invite.
|
||||
/gang deny - Decline a Gang Invite.
|
||||
|
|
Loading…
Reference in New Issue