commit 1d7ae3838897bb0a86a9a00a3fdee98d9f0af4cc Author: Big Pappa Date: Tue Jun 9 12:33:26 2026 -0500 Initial RS-Auger project conversion from SQLite template diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..480bdf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +.kotlin + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b73630f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0c1e1c4 --- /dev/null +++ b/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.rsscripting + RS-Auger + 1.0.0 + + + 21 + 21 + UTF-8 + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + + io.papermc.paper + paper-api + 1.21.6-R0.1-SNAPSHOT + provided + + + + org.xerial + sqlite-jdbc + 3.50.3.0 + + + + + \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/RSAuger.java b/src/main/java/com/rsscripting/rsauger/RSAuger.java new file mode 100644 index 0000000..6a21021 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/RSAuger.java @@ -0,0 +1,186 @@ +package com.rsscripting.rsauger; + +import com.rsscripting.rsauger.commands.RSPluginCommand; +import com.rsscripting.rsauger.commands.RSTabCompleter; +import com.rsscripting.rsauger.config.ConfigManager; +import com.rsscripting.rsauger.database.DatabaseManager; +import com.rsscripting.rsauger.listeners.*; +import com.rsscripting.rsauger.utils.GitHubUpdateChecker; +import com.rsscripting.rsauger.utils.RSConstants; +import org.bukkit.command.PluginCommand; +import org.bukkit.plugin.java.JavaPlugin; + +public class RSAuger + extends JavaPlugin { + + private static RSAuger instance; + + @Override + public void onEnable() { + + saveDefaultConfig(); + + + instance = this; + + /* + |-------------------------------------------------------------------------- + | CONFIG + |-------------------------------------------------------------------------- + */ + + ConfigManager.setup(); + + /* + |-------------------------------------------------------------------------- + | Database + |-------------------------------------------------------------------------- + */ + + DatabaseManager.initialize( + this + ); + + /* + |-------------------------------------------------------------------------- + | LISTENERS + |-------------------------------------------------------------------------- + */ + + /* Convert */ + RSConvertListener + conversionListener = + new RSConvertListener(); + + getServer().getPluginManager().registerEvents( + + conversionListener, + + this + + ); + + /* Main Menu */ + getServer().getPluginManager().registerEvents( + + new RSMenuListener( + conversionListener + ), + + this + + ); + + /* Radius */ + RSRadiusListener radiusListener = + new RSRadiusListener( + conversionListener + ); + + getServer() + .getPluginManager() + .registerEvents( + radiusListener, + this + ); + + /* Admin */ + RSAdminListener adminListener = + new RSAdminListener( + conversionListener + ); + + getServer() + .getPluginManager() + .registerEvents( + adminListener, + this + ); + + /* Filter */ + RSFilterListener filterListener = + new RSFilterListener( + conversionListener + ); + + getServer() + .getPluginManager() + .registerEvents( + filterListener, + this + ); + + getServer() + .getPluginManager() + .registerEvents( + new RSBlockBreakListener(), + this + ); + + /* + |-------------------------------------------------------------------------- + | COMMANDS + |-------------------------------------------------------------------------- + */ + + PluginCommand command = + getCommand( + RSConstants.COMMAND_ALIAS + ); + + if (command != null) { + + command.setExecutor( + new RSPluginCommand() + ); + + command.setTabCompleter( + new RSTabCompleter() + ); + + } + + /* + |-------------------------------------------------------------------------- + | UPDATE CHECKER + |-------------------------------------------------------------------------- + */ + + GitHubUpdateChecker.checkForUpdates(); + + /* + |-------------------------------------------------------------------------- + | ENABLE MESSAGE + |-------------------------------------------------------------------------- + */ + + getLogger().info( + RSConstants.PLUGIN_NAME + + " Enabled" + ); + + } + + @Override + public void onDisable() { + + getLogger().info( + RSConstants.PLUGIN_NAME + + " Disabled" + ); + + } + + /* + |-------------------------------------------------------------------------- + | GET INSTANCE + |-------------------------------------------------------------------------- + */ + + public static RSAuger getInstance() { + + return instance; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/commands/RSPluginCommand.java b/src/main/java/com/rsscripting/rsauger/commands/RSPluginCommand.java new file mode 100644 index 0000000..ad7c5f3 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/commands/RSPluginCommand.java @@ -0,0 +1,102 @@ +package com.rsscripting.rsauger.commands; + +import com.rsscripting.rsauger.config.ConfigManager; +import com.rsscripting.rsauger.utils.RSConstants; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class RSPluginCommand + implements CommandExecutor { + + + + @Override + public boolean onCommand( + + @NotNull CommandSender sender, + @NotNull Command command, + @NotNull String label, + @NotNull String @NotNull [] args + + ) { + + /* + |-------------------------------------------------------------------------- + | BASE COMMAND + |-------------------------------------------------------------------------- + */ + + if (args.length == 0) { + + sender.sendMessage( + RSConstants.PREFIX + + "Running " + + RSConstants.PLUGIN_NAME + ); + + return true; + + } + + /* + |-------------------------------------------------------------------------- + | RELOAD COMMAND + |-------------------------------------------------------------------------- + */ + + if (args[0].equalsIgnoreCase( + "reload" + )) { + + if (!sender.hasPermission( + RSConstants.ADMIN_PERMISSION + )) { + + sender.sendMessage( + RSConstants.PREFIX + + "No permission." + ); + + return true; + + } + + ConfigManager.reload(); + + sender.sendMessage( + RSConstants.PREFIX + + "Configuration reloaded." + ); + + return true; + + } + + /* + |-------------------------------------------------------------------------- + | VERSION COMMAND + |-------------------------------------------------------------------------- + */ + + if (args[0].equalsIgnoreCase( + "version" + )) { + + sender.sendMessage( + RSConstants.PREFIX + + RSConstants.PLUGIN_NAME + + " v" + + RSConstants.VERSION + ); + + return true; + + } + + return true; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/commands/RSTabCompleter.java b/src/main/java/com/rsscripting/rsauger/commands/RSTabCompleter.java new file mode 100644 index 0000000..153e31c --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/commands/RSTabCompleter.java @@ -0,0 +1,46 @@ +package com.rsscripting.rsauger.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class RSTabCompleter + implements TabCompleter { + + @Override + public List onTabComplete( + + @NotNull CommandSender sender, + @NotNull Command command, + @NotNull String label, + @NotNull String @NotNull [] args + + + ) { + + List completions = + new ArrayList<>(); + + /* + |-------------------------------------------------------------------------- + | FIRST ARGUMENT + |-------------------------------------------------------------------------- + */ + + if (args.length == 1) { + + completions.add("reload"); + + completions.add("version"); + + } + + return completions; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/config/ConfigManager.java b/src/main/java/com/rsscripting/rsauger/config/ConfigManager.java new file mode 100644 index 0000000..dc81da6 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/config/ConfigManager.java @@ -0,0 +1,56 @@ +package com.rsscripting.rsauger.config; + +import com.rsscripting.rsauger.RSAuger; +import org.bukkit.configuration.file.FileConfiguration; + +public class ConfigManager { + + private static FileConfiguration config; + + /* + |-------------------------------------------------------------------------- + | SETUP + |-------------------------------------------------------------------------- + */ + + public static void setup() { + + RSAuger.getInstance() + .saveDefaultConfig(); + + config = + RSAuger.getInstance() + .getConfig(); + + } + + /* + |-------------------------------------------------------------------------- + | RELOAD + |-------------------------------------------------------------------------- + */ + + public static void reload() { + + RSAuger.getInstance() + .reloadConfig(); + + config = + RSAuger.getInstance() + .getConfig(); + + } + + /* + |-------------------------------------------------------------------------- + | GET CONFIG + |-------------------------------------------------------------------------- + */ + + public static FileConfiguration get() { + + return config; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/database/DatabaseManager.java b/src/main/java/com/rsscripting/rsauger/database/DatabaseManager.java new file mode 100644 index 0000000..44830f4 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/database/DatabaseManager.java @@ -0,0 +1,241 @@ +package com.rsscripting.rsauger.database; + +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.logging.Level; + +public class DatabaseManager { + + private static JavaPlugin plugin; + + private static String databaseUrl; + + public static void initialize( + JavaPlugin pluginInstance + ) { + + plugin = pluginInstance; + + createDatabase(); + + createTables(); + + updateDatabase(); + + } + + private static void createDatabase() { + + try { + + File databaseFile = + new File( + plugin.getDataFolder(), + "database.db" + ); + + if (!plugin.getDataFolder().exists()) { + + if (!plugin.getDataFolder().mkdirs()) { + + plugin.getLogger().severe( + "Failed to create plugin data folder." + ); + + return; + + } + + } + + databaseUrl = + "jdbc:sqlite:" + + databaseFile.getAbsolutePath(); + + Connection connection = + DriverManager.getConnection( + databaseUrl + ); + + connection.close(); + + plugin.getLogger().info( + "SQLite database initialized." + ); + + } + + catch (Exception e) { + + plugin.getLogger().log( + Level.SEVERE, + "Failed to initialize database.", + e + ); + + } + + } + + private static void createTables() { + + try ( + + Connection connection = + DriverManager.getConnection( + databaseUrl + ) + + ) { + + connection.createStatement().execute( + """ + CREATE TABLE IF NOT EXISTS machines ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + world TEXT NOT NULL, + x INTEGER NOT NULL, + y INTEGER NOT NULL, + z INTEGER NOT NULL, + owner_uuid TEXT, + owner_name TEXT, + machine_type TEXT, + radius INTEGER DEFAULT 5, + paused INTEGER DEFAULT 0, + state TEXT DEFAULT 'ACTIVE', + filter_mode TEXT DEFAULT 'ALLOW_ALL', + created_at TEXT + ) + """ + ); + + connection.createStatement().execute( + """ + CREATE TABLE IF NOT EXISTS machine_filters ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + machine_id INTEGER NOT NULL, + page INTEGER NOT NULL, + slot INTEGER NOT NULL, + item_data TEXT NOT NULL + ) + """ + ); + + plugin.getLogger().info( + "Database tables initialized." + ); + + } + + catch (Exception e) { + + plugin.getLogger().log( + Level.SEVERE, + "Failed to create tables.", + e + ); + + } + + } + + private static void updateDatabase() { + + try ( + + Connection connection = + DriverManager.getConnection( + databaseUrl + ) + + ) { + + ensureColumnExists( + connection, + "machines", + "state", + "TEXT DEFAULT 'ACTIVE'" + ); + + ensureColumnExists( + connection, + "machines", + "error_reason", + "TEXT" + ); + + } + + catch (Exception e) { + + plugin.getLogger().log( + Level.SEVERE, + "Failed to update database.", + e + ); + + } + + } + + private static void ensureColumnExists( + Connection connection, + String table, + String column, + String definition + ) { + + try ( + + var columns = + connection + .getMetaData() + .getColumns( + null, + null, + table, + column + ) + + ) { + + if (!columns.next()) { + + connection.createStatement().execute( + "ALTER TABLE " + + table + + " ADD COLUMN " + + column + + " " + + definition + ); + + } + + } + + catch (Exception e) { + + plugin.getLogger().log( + Level.SEVERE, + "Failed updating column " + + column, + e + ); + + } + + } + + public static Connection getConnection() + throws Exception { + + return DriverManager.getConnection( + databaseUrl + ); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/gui/RSAdminMenu.java b/src/main/java/com/rsscripting/rsauger/gui/RSAdminMenu.java new file mode 100644 index 0000000..a9e0dc3 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/gui/RSAdminMenu.java @@ -0,0 +1,131 @@ +package com.rsscripting.rsauger.gui; + + +import com.rsscripting.rsauger.utils.RSMenuUtils; +import com.rsscripting.rsauger.utils.VersionUtils; +import com.rsscripting.rsauger.utils.GitHubUpdateChecker; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import net.kyori.adventure.text.Component; + +import java.util.List; + +public class RSAdminMenu { + + public static final String MENU_TITLE = "Admin"; + + public static void open( + Player player + ) { + + Inventory menu = + Bukkit.createInventory( + new RSMenuHolder( + "ADMIN" + ), + 18, + Component.text( + MENU_TITLE + ).color( + NamedTextColor.GOLD + ) + ); + + + /* + |-------------------------------------------------------------------------- + | FILLER + |-------------------------------------------------------------------------- + */ + + ItemStack filler = + RSMenuUtils.createFillerPane(); + + for (int i = 0; i < menu.getSize(); i++) { + + menu.setItem(i, filler); + + } + + /* +|-------------------------------------------------------------------------- +| BACK +|-------------------------------------------------------------------------- +*/ + + menu.setItem( + 4, + RSMenuUtils.createMenuItem( + + Material.OAK_DOOR, + + "§eBack" + + ) + ); + + /* + |-------------------------------------------------------------------------- + | RELOAD + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 12, + RSMenuUtils.createMenuItem( + + Material.ENCHANTED_BOOK, + + "§cReload Plugin" + + ) + ); + + /* + |-------------------------------------------------------------------------- + | VERSION + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 14, + RSMenuUtils.createMenuItem( + + Material.BOOK, + + "§ePlugin Version", + + List.of( + + "§7Installed: §f" + + VersionUtils.getVersion(), + + "", + + "§7Status: §f" + + GitHubUpdateChecker.getUpdateStatus(), + + "", + + "§7Latest: §f" + + ( + GitHubUpdateChecker.getLatestVersion() + == null + ? "Unknown" + : GitHubUpdateChecker.getLatestVersion() + ) + + ) + + ) + ); + + player.openInventory(menu); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/gui/RSConversionMenu.java b/src/main/java/com/rsscripting/rsauger/gui/RSConversionMenu.java new file mode 100644 index 0000000..a420dfb --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/gui/RSConversionMenu.java @@ -0,0 +1,66 @@ +package com.rsscripting.rsauger.gui; + +import com.rsscripting.rsauger.utils.RSMenuUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +public class RSConversionMenu { + + public static final String MENU_TITLE = "Activate Item Magnet"; + + public static void open( + Player player + ) { + + Inventory menu = + Bukkit.createInventory( + new RSMenuHolder( + "CONVERT" + ), + 9, + Component.text( + MENU_TITLE + ).color( + NamedTextColor.BLUE + ) + ); + + /* + |-------------------------------------------------------------------------- + | FILLER + |-------------------------------------------------------------------------- + */ + + ItemStack filler = + RSMenuUtils.createFillerPane(); + + for (int i = 0; i < menu.getSize(); i++) { + + menu.setItem(i, filler); + + } + + /* + |-------------------------------------------------------------------------- + | CONVERT BUTTON + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 4, + RSMenuUtils.createMenuItem( + Material.CRAFTING_TABLE, + "§aConvert" + ) + ); + + player.openInventory(menu); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/gui/RSFilterMenu.java b/src/main/java/com/rsscripting/rsauger/gui/RSFilterMenu.java new file mode 100644 index 0000000..6fa9bf8 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/gui/RSFilterMenu.java @@ -0,0 +1,227 @@ +package com.rsscripting.rsauger.gui; + +import com.rsscripting.rsauger.managers.MachineManager; +import com.rsscripting.rsauger.utils.RSKeys; +import com.rsscripting.rsauger.utils.RSMenuUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.Map; + +public class RSFilterMenu { + + public static final String MENU_TITLE = + "Filter"; + + public static void open( + Player player, + Block block + ) { + + open( + player, + block, + 1 + ); + + } + + public static void open( + Player player, + Block block, + int page + ) { + + RSMenuHolder holder = + new RSMenuHolder( + "FILTER" + ); + + holder.setPage( + page + ); + + Inventory menu = + Bukkit.createInventory( + holder, + 54, + Component.text( + MENU_TITLE + + " [" + + holder.getPage() + + "]" + ).color( + NamedTextColor.BLUE + ) + ); + + /* + |-------------------------------------------------------------------------- + | TOP ROW FILLER + |-------------------------------------------------------------------------- + */ + + ItemStack filler = + RSMenuUtils.createFillerPane(); + + for (int i = 0; i < 9; i++) { + + menu.setItem( + i, + filler + ); + + } + +/* +|-------------------------------------------------------------------------- +| FILTER MODE +|-------------------------------------------------------------------------- +*/ + + String filterMode = + MachineManager.getFilterMode( + block + ); + + Material filterMaterial; + + String filterName; + + if (filterMode.equals( + RSKeys.FILTER_WHITELIST + )) { + + filterMaterial = + Material.WHITE_WOOL; + + filterName = + "§aWhitelist"; + + } + + else if (filterMode.equals( + RSKeys.FILTER_BLACKLIST + )) { + + filterMaterial = + Material.BLACK_WOOL; + + filterName = + "§cBlacklist"; + + } + + else { + + filterMaterial = + Material.LIME_WOOL; + + filterName = + "§aAllow All"; + + } + + menu.setItem( + 3, + RSMenuUtils.createMenuItem( + filterMaterial, + filterName + ) + ); + + /* + |-------------------------------------------------------------------------- + | PREVIOUS PAGE + |-------------------------------------------------------------------------- + */ + + if (holder.getPage() > 1) { + + menu.setItem( + 0, + RSMenuUtils.createMenuItem( + Material.ARROW, + "§ePrevious Page (" + holder.getPage() + ")" + ) + ); + + } + + /* + |-------------------------------------------------------------------------- + | FILTER ITEMS + |-------------------------------------------------------------------------- + */ + + Map filterItems = + MachineManager.getFilterItems( + block, + holder.getPage() + ); + + for (Integer slot : filterItems.keySet()) { + + menu.setItem( + slot, + filterItems.get( + slot + ) + ); + + } + + /* + |-------------------------------------------------------------------------- + | NEXT PAGE + |-------------------------------------------------------------------------- + */ + + int highestPage = + MachineManager.getHighestFilterPage( + block + ); + + if (holder.getPage() + <= highestPage) { + + menu.setItem( + 8, + RSMenuUtils.createMenuItem( + Material.ARROW, + "§eNext Page (" + holder.getPage() + ")" + ) + ); + + } + + /* + |-------------------------------------------------------------------------- + | BACK + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 5, + RSMenuUtils.createMenuItem( + + Material.OAK_DOOR, + + "§eBack" + + ) + ); + + player.openInventory( + menu + ); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/gui/RSMainMenu.java b/src/main/java/com/rsscripting/rsauger/gui/RSMainMenu.java new file mode 100644 index 0000000..8741bf0 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/gui/RSMainMenu.java @@ -0,0 +1,162 @@ +package com.rsscripting.rsauger.gui; + +import com.rsscripting.rsauger.utils.RSConstants; +import com.rsscripting.rsauger.utils.RSMenuUtils; +import com.rsscripting.rsauger.managers.MachineManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class RSMainMenu { + + public static final String MENU_TITLE = "Main"; + + public static void open( + Player player, + Block block + ) { + + Inventory menu = + Bukkit.createInventory( + new RSMenuHolder( + "MAIN" + ), + 18, + Component.text( + MENU_TITLE + ).color( + NamedTextColor.BLUE + ) + ); + + /* + |-------------------------------------------------------------------------- + | FILLER + |-------------------------------------------------------------------------- + */ + + ItemStack filler = + RSMenuUtils.createFillerPane(); + + for (int i = 0; i < menu.getSize(); i++) { + + menu.setItem(i, filler); + + } + + /* + |-------------------------------------------------------------------------- + | CONVERT BACK + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 2, + RSMenuUtils.createMenuItem( + Material.COMPOSTER, + "§6Convert Back" + ) + ); + + /* + |-------------------------------------------------------------------------- + | PAUSE / RESUME + |-------------------------------------------------------------------------- + */ + + boolean paused = + MachineManager.isPaused( + block + ); + + menu.setItem( + 6, + RSMenuUtils.createMenuItem( + + paused + ? Material.RED_DYE + : Material.GREEN_DYE, + + paused + ? "§cPaused" + : "§aRunning" + + ) + ); + + /* + |-------------------------------------------------------------------------- + | RADIUS + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 11, + RSMenuUtils.createMenuItem( + + Material.COMPASS, + + "§bRadius", + + List.of( + "§7Current Radius: §f" + + MachineManager.getRadius(block) + ) + + ) + ); + + /* + |-------------------------------------------------------------------------- + | FILTER + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 15, + RSMenuUtils.createMenuItem( + + Material.HOPPER, + + "§eFilter", + + List.of( + "§7Mode: §f" + + MachineManager.getFilterMode(block) + ) + + ) + ); + + /* + |-------------------------------------------------------------------------- + | ADMIN + |-------------------------------------------------------------------------- + */ + + if (player.hasPermission( + RSConstants.ADMIN_PERMISSION + )) { + + menu.setItem( + 4, + RSMenuUtils.createMenuItem( + Material.COMMAND_BLOCK, + "§cAdmin" + ) + ); + + } + + player.openInventory(menu); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/gui/RSMenuHolder.java b/src/main/java/com/rsscripting/rsauger/gui/RSMenuHolder.java new file mode 100644 index 0000000..a604cba --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/gui/RSMenuHolder.java @@ -0,0 +1,57 @@ +package com.rsscripting.rsauger.gui; + +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.jetbrains.annotations.NotNull; + +public class RSMenuHolder + implements InventoryHolder { + + private final String menuId; + + private int page = 1; + + public RSMenuHolder( + String menuId + ) { + + this.menuId = menuId; + + } + + public String getMenuId() { + + return menuId; + + } + + public int getPage() { + + return page; + + } + + public void setPage( + int page + ) { + + if (page < 1) { + + page = 1; + + } + + this.page = page; + + } + + @Override + public @NotNull Inventory getInventory() { + + throw new UnsupportedOperationException( + "RSMenuHolder does not store an inventory." + ); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/gui/RSRadiusMenu.java b/src/main/java/com/rsscripting/rsauger/gui/RSRadiusMenu.java new file mode 100644 index 0000000..2f88d63 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/gui/RSRadiusMenu.java @@ -0,0 +1,158 @@ +package com.rsscripting.rsauger.gui; + +import com.rsscripting.rsauger.managers.MachineManager; +import com.rsscripting.rsauger.utils.RSMenuUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class RSRadiusMenu { + + + public static void open( + Player player, + Block block + ) { + + Inventory menu = + Bukkit.createInventory( + new RSMenuHolder( + "RADIUS" + ), + 18, + Component.text( + "Radius: " + + MachineManager.getRadius( + block + ) + ).color(NamedTextColor.BLUE) + ); + + /* + |-------------------------------------------------------------------------- + | FILLER + |-------------------------------------------------------------------------- + */ + + ItemStack filler = + RSMenuUtils.createFillerPane(); + + for (int i = 0; i < menu.getSize(); i++) { + + menu.setItem(i, filler); + + } + + /* +|-------------------------------------------------------------------------- +| BACK +|-------------------------------------------------------------------------- +*/ + + menu.setItem( + 4, + RSMenuUtils.createMenuItem( + + Material.OAK_DOOR, + + "§eBack" + + ) + ); + + /* + |-------------------------------------------------------------------------- + | CURRENT RADIUS + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 13, + RSMenuUtils.createMenuItem( + + Material.COMPASS, + + "§bCurrent Radius", + + List.of( + "§7Radius: §f" + + MachineManager.getRadius( + block + ) + ) + + ) + ); + + /* + |-------------------------------------------------------------------------- + | NEGATIVE BUTTONS + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 10, + RSMenuUtils.createMenuItem( + Material.RED_WOOL, + "§c-10" + ) + ); + + menu.setItem( + 11, + RSMenuUtils.createMenuItem( + Material.RED_WOOL, + "§c-5" + ) + ); + + menu.setItem( + 12, + RSMenuUtils.createMenuItem( + Material.RED_WOOL, + "§c-1" + ) + ); + + /* + |-------------------------------------------------------------------------- + | POSITIVE BUTTONS + |-------------------------------------------------------------------------- + */ + + menu.setItem( + 14, + RSMenuUtils.createMenuItem( + Material.GREEN_WOOL, + "§a+1" + ) + ); + + menu.setItem( + 15, + RSMenuUtils.createMenuItem( + Material.GREEN_WOOL, + "§a+5" + ) + ); + + menu.setItem( + 16, + RSMenuUtils.createMenuItem( + Material.GREEN_WOOL, + "§a+10" + ) + ); + + player.openInventory(menu); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/gui/session/GuiSession.java b/src/main/java/com/rsscripting/rsauger/gui/session/GuiSession.java new file mode 100644 index 0000000..310d934 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/gui/session/GuiSession.java @@ -0,0 +1,29 @@ +package com.rsscripting.rsauger.gui.session; + +import org.bukkit.block.Block; + +import java.util.UUID; + +public class GuiSession { + + private final UUID playerUuid; + + private Block selectedBlock; + + public GuiSession(UUID playerUuid) { + this.playerUuid = playerUuid; + } + + public UUID getPlayerUuid() { + return playerUuid; + } + + public Block getSelectedBlock() { + return selectedBlock; + } + + public void setSelectedBlock(Block selectedBlock) { + this.selectedBlock = selectedBlock; + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/gui/session/GuiSessionManager.java b/src/main/java/com/rsscripting/rsauger/gui/session/GuiSessionManager.java new file mode 100644 index 0000000..39c1f7f --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/gui/session/GuiSessionManager.java @@ -0,0 +1,35 @@ +package com.rsscripting.rsauger.gui.session; + +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class GuiSessionManager { + + private static final Map sessions = + new HashMap<>(); + + public static GuiSession getSession( + Player player + ) { + + return sessions.computeIfAbsent( + player.getUniqueId(), + GuiSession::new + ); + + } + + public static void removeSession( + Player player + ) { + + sessions.remove( + player.getUniqueId() + ); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/listeners/RSAdminListener.java b/src/main/java/com/rsscripting/rsauger/listeners/RSAdminListener.java new file mode 100644 index 0000000..3bc951c --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/listeners/RSAdminListener.java @@ -0,0 +1,126 @@ +package com.rsscripting.rsauger.listeners; + +import com.rsscripting.rsauger.config.ConfigManager; +import com.rsscripting.rsauger.gui.RSAdminMenu; +import com.rsscripting.rsauger.gui.RSMenuHolder; +import com.rsscripting.rsauger.utils.RSConstants; +import com.rsscripting.rsauger.gui.RSMainMenu; +import org.bukkit.block.Block; +import com.rsscripting.rsauger.utils.RSMessageUtils; +import org.bukkit.entity.Player; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class RSAdminListener + implements Listener { + + private final RSConvertListener + conversionListener; + + public RSAdminListener( + RSConvertListener conversionListener + ) { + + this.conversionListener = + conversionListener; + + } + + @EventHandler + public void onInventoryClick( + InventoryClickEvent event + ) { + + if (!(event.getWhoClicked() + instanceof Player player)) { + return; + } + + if (!(event.getInventory() + .getHolder() + instanceof RSMenuHolder holder)) { + return; + } + + if (!holder.getMenuId() + .equals( + "ADMIN" + )) { + return; + } + + event.setCancelled(true); + + /* + |-------------------------------------------------------------------------- + | SECURITY + |-------------------------------------------------------------------------- + */ + + if (!player.isOp() + || + + !player.hasPermission( + RSConstants.ADMIN_PERMISSION + )) { + + player.closeInventory(); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | BACK + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 4) { + + Block block = + conversionListener.getSelectedBlock(player); + + if (block == null) { + + player.closeInventory(); + + return; + + } + + RSMainMenu.open( + player, + block + ); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | RELOAD + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 12) { + + ConfigManager.reload(); + + RSMessageUtils.success( + player, + "Configuration reloaded." + ); + + RSAdminMenu.open( + player + ); + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/listeners/RSBlockBreakListener.java b/src/main/java/com/rsscripting/rsauger/listeners/RSBlockBreakListener.java new file mode 100644 index 0000000..d3cf3d6 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/listeners/RSBlockBreakListener.java @@ -0,0 +1,28 @@ +package com.rsscripting.rsauger.listeners; + +import com.rsscripting.rsauger.managers.MachineManager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; + +public class RSBlockBreakListener + implements Listener { + + @EventHandler + public void onBlockBreak( + BlockBreakEvent event + ) { + + if (MachineManager.machineExists( + event.getBlock() + )) { + + event.setCancelled( + true + ); + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/listeners/RSConvertListener.java b/src/main/java/com/rsscripting/rsauger/listeners/RSConvertListener.java new file mode 100644 index 0000000..7f2465a --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/listeners/RSConvertListener.java @@ -0,0 +1,216 @@ +package com.rsscripting.rsauger.listeners; + +import com.rsscripting.rsauger.gui.RSConversionMenu; +import com.rsscripting.rsauger.gui.RSMainMenu; +import com.rsscripting.rsauger.managers.MachineManager; +import com.rsscripting.rsauger.utils.RSConstants; +import com.rsscripting.rsauger.gui.session.GuiSession; +import com.rsscripting.rsauger.gui.session.GuiSessionManager; + +import com.rsscripting.rsauger.utils.RSMessageUtils; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +public class RSConvertListener + implements Listener { + + @EventHandler + public void onPlayerInteractBlock( + PlayerInteractEvent event + ) { + + Player player = + event.getPlayer(); + + Block block = + event.getClickedBlock(); + + if (block == null) { + return; + } + + /* + |-------------------------------------------------------------------------- + | REQUIRE SNEAKING + |-------------------------------------------------------------------------- + */ + + if (!player.isSneaking()) { + return; + } + + /* + |-------------------------------------------------------------------------- + | VALIDATE TARGET ENTITY + |-------------------------------------------------------------------------- + */ + + if (block.getType() != + RSConstants.REQUIRED_TARGET_BLOCK) { + return; + } + + /* + |-------------------------------------------------------------------------- + | VALIDATE HELD ITEM + |-------------------------------------------------------------------------- + */ + + ItemStack heldItem = + player.getInventory() + .getItemInMainHand(); + + if (heldItem.getType() != + RSConstants.REQUIRED_HELD_ITEM) { + return; + } + + /* + |-------------------------------------------------------------------------- + | CANCEL VANILLA ACTION + |-------------------------------------------------------------------------- + */ + + event.setCancelled(true); + + /* + |-------------------------------------------------------------------------- + | STORE SELECTED ENTITY + |-------------------------------------------------------------------------- + */ + + GuiSession session = + GuiSessionManager.getSession( + player + ); + + session.setSelectedBlock( + block + ); + + /* +|-------------------------------------------------------------------------- +| ALREADY CONVERTED +|-------------------------------------------------------------------------- +*/ + + if (MachineManager.machineExists( + block + )) { + + /* + |-------------------------------------------------------------------------- + | OWNER CHECK + |-------------------------------------------------------------------------- + */ + + if (!MachineManager.isOwner( + block, + player + ) + + && + + !player.hasPermission( + RSConstants.BYPASS_PERMISSION + ) + + ) { + + RSMessageUtils.error( + player, + "You are not the owner." + ); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | OPEN MAIN MENU + |-------------------------------------------------------------------------- + */ + + RSMainMenu.open( + player, + block + ); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | OPEN CONVERSION MENU + |-------------------------------------------------------------------------- + */ + + RSConversionMenu.open(player); + + } + + /* + |-------------------------------------------------------------------------- + | GET SELECTED ENTITY + |-------------------------------------------------------------------------- + */ + + public Block getSelectedBlock( + Player player + ) { + + GuiSession session = + GuiSessionManager.getSession( + player + ); + + return session.getSelectedBlock(); + + } + + /* + |-------------------------------------------------------------------------- + | Convert Back + |-------------------------------------------------------------------------- + */ + + public void convertBack( + Player player + ) { + + GuiSession session = + GuiSessionManager.getSession( + player + ); + + Block block = + session.getSelectedBlock(); + + if (block == null) { + + player.closeInventory(); + + return; + + } + + MachineManager.deleteMachine( + block + ); + + RSMessageUtils.success( + player, + "Machine removed." + ); + + player.closeInventory(); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/listeners/RSFilterListener.java b/src/main/java/com/rsscripting/rsauger/listeners/RSFilterListener.java new file mode 100644 index 0000000..258a0c6 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/listeners/RSFilterListener.java @@ -0,0 +1,295 @@ +package com.rsscripting.rsauger.listeners; + +import com.rsscripting.rsauger.gui.RSFilterMenu; +import com.rsscripting.rsauger.gui.RSMainMenu; +import com.rsscripting.rsauger.gui.RSMenuHolder; +import com.rsscripting.rsauger.managers.MachineManager; +import com.rsscripting.rsauger.managers.RSConversionManager; +import com.rsscripting.rsauger.utils.RSKeys; +import com.rsscripting.rsauger.utils.RSMessageUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +public class RSFilterListener + implements Listener { + + + + + + private final RSConvertListener + conversionListener; + + public RSFilterListener( + RSConvertListener conversionListener + ) { + + this.conversionListener = + conversionListener; + + } + + @EventHandler + public void onInventoryClick( + InventoryClickEvent event + ) { + + if (!(event.getWhoClicked() + instanceof Player player)) { + return; + } + + if (!(event.getInventory() + .getHolder() + instanceof RSMenuHolder holder)) { + return; + } + + if (!holder.getMenuId() + .equals( + "FILTER" + )) { + return; + } + + Block block = + conversionListener.getSelectedBlock(player); + + if (block == null) { + + player.closeInventory(); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | TOP ROW + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() < 9) { + + event.setCancelled(true); + + /* + |-------------------------------------------------------------------------- + | FILTER MODE + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 3) { + + String currentMode = + MachineManager.getFilterMode( + block + ); + + String nextMode; + + if (currentMode.equals( + RSKeys.FILTER_ALLOW_ALL + )) { + + nextMode = + RSKeys.FILTER_WHITELIST; + + } + + else if (currentMode.equals( + RSKeys.FILTER_WHITELIST + )) { + + nextMode = + RSKeys.FILTER_BLACKLIST; + + } + + else { + + nextMode = + RSKeys.FILTER_ALLOW_ALL; + + } + + MachineManager.setFilterMode( + block, + nextMode + ); + + RSFilterMenu.open( + player, + block + ); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | PREVIOUS PAGE + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 0 + && event.getCurrentItem() != null + && event.getCurrentItem().getType() + == Material.ARROW) { + + if (holder.getPage() > 1) { + + holder.setPage( + holder.getPage() - 1 + ); + + RSFilterMenu.open( + player, + block, + holder.getPage() + ); + + } + + return; + + } + + /* + |-------------------------------------------------------------------------- + | NEXT PAGE + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 8 + && event.getCurrentItem() != null + && event.getCurrentItem().getType() + == Material.ARROW) { + + int highestPage = + MachineManager.getHighestFilterPage( + block + ); + + if (holder.getPage() + <= highestPage) { + + holder.setPage( + holder.getPage() + 1 + ); + + RSFilterMenu.open( + player, + block, + holder.getPage() + ); + + } + + return; + + } + + /* + |-------------------------------------------------------------------------- + | BACK + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 5) { + + RSMainMenu.open( + player, + block + ); + + return; + + } + + return; + + } + + if (event.getRawSlot() >= event.getInventory().getSize()) { + return; + } + + /* + |-------------------------------------------------------------------------- + | FILTER STORAGE + |-------------------------------------------------------------------------- + */ + + event.setCancelled(true); + + if (event.getCursor().getType() + != Material.AIR) { + + ItemStack filterItem = + event.getCursor().clone(); + + filterItem.setAmount(1); + + if (RSConversionManager.containsFilterItem( + block, + filterItem + )) { + + RSMessageUtils.info( + player, + "That item is already in the filter." + ); + + return; + + } + + event.getInventory().setItem( + event.getRawSlot(), + filterItem + ); + + MachineManager.saveFilterItem( + block, + holder.getPage(), + event.getRawSlot(), + filterItem + ); + + RSFilterMenu.open( + player, + block, + holder.getPage() + ); + + return; + + } + + event.getInventory().setItem( + event.getRawSlot(), + null + ); + + MachineManager.removeFilterItem( + block, + holder.getPage(), + event.getRawSlot() + ); + + RSFilterMenu.open( + player, + block, + holder.getPage() + ); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/listeners/RSMenuListener.java b/src/main/java/com/rsscripting/rsauger/listeners/RSMenuListener.java new file mode 100644 index 0000000..cc6dca4 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/listeners/RSMenuListener.java @@ -0,0 +1,275 @@ +package com.rsscripting.rsauger.listeners; + +import com.rsscripting.rsauger.config.ConfigManager; +import com.rsscripting.rsauger.managers.MachineManager; +import com.rsscripting.rsauger.gui.*; +import com.rsscripting.rsauger.utils.RSConstants; +import com.rsscripting.rsauger.utils.RSKeys; +import com.rsscripting.rsauger.utils.RSMessageUtils; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class RSMenuListener + implements Listener { + + private final RSConvertListener + conversionListener; + + public RSMenuListener( + RSConvertListener conversionListener + ) { + + this.conversionListener = + conversionListener; + + } + + @EventHandler + public void onInventoryClick( + InventoryClickEvent event + ) { + + Player player = + (Player) event.getWhoClicked(); + + /* + |-------------------------------------------------------------------------- + | CONVERSION MENU + |-------------------------------------------------------------------------- + */ + + if (event.getInventory() + .getHolder() + instanceof RSMenuHolder holder + && holder.getMenuId() + .equals( + "CONVERT" + )) { + + event.setCancelled(true); + + if (event.getCurrentItem() == null) { + return; + } + + if (event.getRawSlot() == 4) { + + Block block = + conversionListener.getSelectedBlock(player); + + if (block == null){ + + player.closeInventory(); + + return; + + } + + MachineManager.insertMachine( + block + ); + + MachineManager.setOwner( + block, + player + ); + + MachineManager.setPaused( + block, + false + ); + + MachineManager.setRadius( + block, + + (int) ConfigManager.get().getDouble( + "default-radius" + ) + ); + + MachineManager.setFilterMode( + block, + RSKeys.FILTER_ALLOW_ALL + ); + +/* +|-------------------------------------------------------------------------- +| ENTITY DISPLAY NAME +|-------------------------------------------------------------------------- +| +| Intentionally disabled. +| +| Some future entity-based plugins (villager systems, escorts, +| traders, guards, etc.) may want visible custom names. +| +*/ + +/* + entity.customName( + net.kyori.adventure.text.Component.text( + RSConstants.ENTITY_DISPLAY_NAME + ) + ); + + entity.setCustomNameVisible(true); +*/ + + + + RSMessageUtils.success( + player, + "Converted Successfully." + ); + + RSMainMenu.open( + player, + block + ); + + } + + return; + + } + + /* + |-------------------------------------------------------------------------- + | MAIN MENU + |-------------------------------------------------------------------------- + */ + + if (event.getInventory() + .getHolder() + instanceof RSMenuHolder holder + && holder.getMenuId() + .equals( + "MAIN" + )) { + + event.setCancelled(true); + + if (event.getCurrentItem() == null) { + return; + } + + Block block = + conversionListener.getSelectedBlock(player); + + if (block == null) { + + player.closeInventory(); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | CONVERT BACK + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 2) { + + conversionListener.convertBack( + player + ); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | PAUSE / RESUME + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 6) { + + boolean paused = + MachineManager.isPaused( + block + ); + + MachineManager.setPaused( + block, + !paused + ); + + RSMainMenu.open( + player, + block + ); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | RADIUS MENU + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 11) { + + RSRadiusMenu.open( + player, + block + ); + + return; + + } + +/* +|-------------------------------------------------------------------------- +| FILTER +|-------------------------------------------------------------------------- +*/ + + if (event.getRawSlot() == 15) { + + RSFilterMenu.open( + player, + block + ); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | ADMIN MENU + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 4) { + + if (!player.isOp() + || + + !player.hasPermission( + RSConstants.ADMIN_PERMISSION + )) { + + return; + + } + + RSAdminMenu.open( + player + ); + + } + + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/listeners/RSRadiusListener.java b/src/main/java/com/rsscripting/rsauger/listeners/RSRadiusListener.java new file mode 100644 index 0000000..0c73c78 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/listeners/RSRadiusListener.java @@ -0,0 +1,156 @@ +package com.rsscripting.rsauger.listeners; + +import com.rsscripting.rsauger.config.ConfigManager; +import com.rsscripting.rsauger.gui.RSMainMenu; +import com.rsscripting.rsauger.gui.RSMenuHolder; +import com.rsscripting.rsauger.gui.RSRadiusMenu; +import com.rsscripting.rsauger.managers.MachineManager; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class RSRadiusListener + implements Listener { + + private final RSConvertListener + conversionListener; + + public RSRadiusListener( + RSConvertListener conversionListener + ) { + + this.conversionListener = + conversionListener; + + } + + @EventHandler + public void onInventoryClick( + InventoryClickEvent event + ) { + + if (!(event.getWhoClicked() + instanceof Player player)) { + return; + } + + if (!(event.getInventory() + .getHolder() + instanceof RSMenuHolder holder)) { + return; + } + + if (!holder.getMenuId() + .equals( + "RADIUS" + )) { + return; + } + + event.setCancelled(true); + + if (event.getCurrentItem() == null) { + return; + } + + Block block = + conversionListener.getSelectedBlock(player); + + if (block == null) { + + player.closeInventory(); + + return; + + } + + /* + |-------------------------------------------------------------------------- + | BACK + |-------------------------------------------------------------------------- + */ + + if (event.getRawSlot() == 4) { + + RSMainMenu.open( + player, + block + ); + + return; + + } + + int radius = + MachineManager.getRadius( + block + ); + + int change; + + switch (event.getRawSlot()) { + + case 10: + change = -10; + break; + + case 11: + change = -5; + break; + + case 12: + change = -1; + break; + + case 14: + change = 1; + break; + + case 15: + change = 5; + break; + + case 16: + change = 10; + break; + + default: + return; + + } + + radius += change; + + if (radius < 1) { + radius = 1; + } + + int maxRadius = + (int) ConfigManager.get() + .getDouble( + "max-radius" + ); + if (maxRadius > 0 + && radius > maxRadius) { + + radius = maxRadius; + + } + + MachineManager.setRadius( + block, + radius + ); + + RSRadiusMenu.open( + player, + block + ); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/machine/MachineError.java b/src/main/java/com/rsscripting/rsauger/machine/MachineError.java new file mode 100644 index 0000000..4c3160f --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/machine/MachineError.java @@ -0,0 +1,17 @@ +package com.rsscripting.rsauger.machine; + +public enum MachineError { + + NONE, + + MISSING_TARGET, + + MISSING_SOURCE, + + INVALID_TARGET, + + INVALID_SOURCE, + + INVALID_CONFIGURATION + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/machine/MachineState.java b/src/main/java/com/rsscripting/rsauger/machine/MachineState.java new file mode 100644 index 0000000..6c654f1 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/machine/MachineState.java @@ -0,0 +1,13 @@ +package com.rsscripting.rsauger.machine; + +public enum MachineState { + + ACTIVE, + + PAUSED, + + ERROR, + + WAITING_SETUP + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/managers/MachineManager.java b/src/main/java/com/rsscripting/rsauger/managers/MachineManager.java new file mode 100644 index 0000000..d35e153 --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/managers/MachineManager.java @@ -0,0 +1,1558 @@ +package com.rsscripting.rsauger.managers; + +import com.rsscripting.rsauger.database.DatabaseManager; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.UUID; +import java.util.Base64; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ByteArrayInputStream; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.util.io.BukkitObjectInputStream; +import org.bukkit.inventory.ItemStack; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.util.io.BukkitObjectOutputStream; + +import com.rsscripting.rsauger.machine.MachineState; +import com.rsscripting.rsauger.machine.MachineError; + +public class MachineManager { + + public static boolean machineExists( + Block block + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT id + FROM machines + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + LIMIT 1 + """ + ) + + ) { + + statement.setString( + 1, + block.getWorld().getName() + ); + + statement.setInt( + 2, + block.getX() + ); + + statement.setInt( + 3, + block.getY() + ); + + statement.setInt( + 4, + block.getZ() + ); + + ResultSet result = + statement.executeQuery(); + + return result.next(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + return false; + + } + + } + + public static void insertMachine( + Block block + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + INSERT INTO machines ( + world, + x, + y, + z, + created_at + ) + VALUES ( + ?, ?, ?, ?, datetime('now') + ) + """ + ) + + ) { + + statement.setString( + 1, + block.getWorld().getName() + ); + + statement.setInt( + 2, + block.getX() + ); + + statement.setInt( + 3, + block.getY() + ); + + statement.setInt( + 4, + block.getZ() + ); + + statement.executeUpdate(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static void deleteMachine( + Block block + ) { + + int machineId = + getMachineId( + block + ); + + try ( + + Connection connection = + DatabaseManager.getConnection() + + ) { + + if (machineId != -1) { + + try ( + + PreparedStatement filterStatement = + connection.prepareStatement( + """ + DELETE FROM machine_filters + WHERE machine_id = ? + """ + ) + + ) { + + filterStatement.setInt( + 1, + machineId + ); + + filterStatement.executeUpdate(); + + } + + } + + try ( + + PreparedStatement machineStatement = + connection.prepareStatement( + """ + DELETE FROM machines + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + """ + ) + + ) { + + machineStatement.setString( + 1, + block.getWorld().getName() + ); + + machineStatement.setInt( + 2, + block.getX() + ); + + machineStatement.setInt( + 3, + block.getY() + ); + + machineStatement.setInt( + 4, + block.getZ() + ); + + machineStatement.executeUpdate(); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static void setOwner( + Block block, + Player player + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE machines + SET owner_uuid = ?, + owner_name = ? + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + """ + ) + + ) { + + statement.setString( + 1, + player.getUniqueId().toString() + ); + + statement.setString( + 2, + player.getName() + ); + + statement.setString( + 3, + block.getWorld().getName() + ); + + statement.setInt( + 4, + block.getX() + ); + + statement.setInt( + 5, + block.getY() + ); + + statement.setInt( + 6, + block.getZ() + ); + + statement.executeUpdate(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static boolean isOwner( + Block block, + Player player + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT owner_uuid + FROM machines + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + LIMIT 1 + """ + ) + + ) { + + statement.setString( + 1, + block.getWorld().getName() + ); + + statement.setInt( + 2, + block.getX() + ); + + statement.setInt( + 3, + block.getY() + ); + + statement.setInt( + 4, + block.getZ() + ); + + ResultSet result = + statement.executeQuery(); + + if (!result.next()) { + + return false; + + } + + String ownerUuid = + result.getString( + "owner_uuid" + ); + + if (ownerUuid == null) { + + return false; + + } + + return UUID.fromString( + ownerUuid + ).equals( + player.getUniqueId() + ); + + } + + catch (Exception e) { + + e.printStackTrace(); + + return false; + + } + + } + + public static void setRadius( + Block block, + int radius + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE machines + SET radius = ? + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + """ + ) + + ) { + + statement.setInt( + 1, + radius + ); + + statement.setString( + 2, + block.getWorld().getName() + ); + + statement.setInt( + 3, + block.getX() + ); + + statement.setInt( + 4, + block.getY() + ); + + statement.setInt( + 5, + block.getZ() + ); + + statement.executeUpdate(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static int getRadius( + Block block + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT radius + FROM machines + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + LIMIT 1 + """ + ) + + ) { + + statement.setString( + 1, + block.getWorld().getName() + ); + + statement.setInt( + 2, + block.getX() + ); + + statement.setInt( + 3, + block.getY() + ); + + statement.setInt( + 4, + block.getZ() + ); + + ResultSet result = + statement.executeQuery(); + + if (result.next()) { + + return result.getInt( + "radius" + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return 5; + + } + + public static void setPaused( + Block block, + boolean paused + ) { + + if (paused) { + + setMachineState( + block, + MachineState.PAUSED + ); + + } + + else { + + setMachineState( + block, + MachineState.ACTIVE + ); + + } + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE machines + SET paused = ? + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + """ + ) + + ) { + + statement.setBoolean( + 1, + paused + ); + + statement.setString( + 2, + block.getWorld().getName() + ); + + statement.setInt( + 3, + block.getX() + ); + + statement.setInt( + 4, + block.getY() + ); + + statement.setInt( + 5, + block.getZ() + ); + + statement.executeUpdate(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static boolean isPaused( + Block block + ) { + + return getMachineState( + block + ) == MachineState.PAUSED; + + } + + public static void setFilterMode( + Block block, + String filterMode + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE machines + SET filter_mode = ? + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + """ + ) + + ) { + + statement.setString( + 1, + filterMode + ); + + statement.setString( + 2, + block.getWorld().getName() + ); + + statement.setInt( + 3, + block.getX() + ); + + statement.setInt( + 4, + block.getY() + ); + + statement.setInt( + 5, + block.getZ() + ); + + statement.executeUpdate(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static String getFilterMode( + Block block + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT filter_mode + FROM machines + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + LIMIT 1 + """ + ) + + ) { + + statement.setString( + 1, + block.getWorld().getName() + ); + + statement.setInt( + 2, + block.getX() + ); + + statement.setInt( + 3, + block.getY() + ); + + statement.setInt( + 4, + block.getZ() + ); + + ResultSet result = + statement.executeQuery(); + + if (result.next()) { + + return result.getString( + "filter_mode" + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return "ALLOW_ALL"; + + } + + public static int getMachineId( + Block block + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT id + FROM machines + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + LIMIT 1 + """ + ) + + ) { + + statement.setString( + 1, + block.getWorld().getName() + ); + + statement.setInt( + 2, + block.getX() + ); + + statement.setInt( + 3, + block.getY() + ); + + statement.setInt( + 4, + block.getZ() + ); + + ResultSet result = + statement.executeQuery(); + + if (result.next()) { + + return result.getInt( + "id" + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return -1; + + } + + public static void removeFilterItem( + Block block, + int page, + int slot + ) { + + int machineId = + getMachineId( + block + ); + + if (machineId == -1) { + + return; + + } + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + DELETE FROM machine_filters + WHERE machine_id = ? + AND page = ? + AND slot = ? + """ + ) + + ) { + + statement.setInt( + 1, + machineId + ); + + statement.setInt( + 2, + page + ); + + statement.setInt( + 3, + slot + ); + + statement.executeUpdate(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static String serializeItemStack( + ItemStack itemStack + ) { + + try { + + ByteArrayOutputStream outputStream = + new ByteArrayOutputStream(); + + BukkitObjectOutputStream dataOutput = + new BukkitObjectOutputStream( + outputStream + ); + + dataOutput.writeObject( + itemStack + ); + + dataOutput.close(); + + return Base64.getEncoder() + .encodeToString( + outputStream.toByteArray() + ); + + } + + catch (IOException e) { + + e.printStackTrace(); + + } + + return null; + + } + + public static void saveFilterItem( + Block block, + int page, + int slot, + ItemStack itemStack + ) { + + int machineId = + getMachineId( + block + ); + + if (machineId == -1) { + + return; + + } + + removeFilterItem( + block, + page, + slot + ); + + String serializedItem = + serializeItemStack( + itemStack + ); + + if (serializedItem == null) { + + return; + + } + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + INSERT INTO machine_filters + ( + machine_id, + page, + slot, + item_data + ) + VALUES + ( + ?, ?, ?, ? + ) + """ + ) + + ) { + + statement.setInt( + 1, + machineId + ); + + statement.setInt( + 2, + page + ); + + statement.setInt( + 3, + slot + ); + + statement.setString( + 4, + serializedItem + ); + + statement.executeUpdate(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static ItemStack deserializeItemStack( + String serializedItem + ) { + + try { + + byte[] data = + Base64.getDecoder() + .decode( + serializedItem + ); + + BukkitObjectInputStream inputStream = + new BukkitObjectInputStream( + new ByteArrayInputStream( + data + ) + ); + + ItemStack itemStack = + (ItemStack) inputStream.readObject(); + + inputStream.close(); + + return itemStack; + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return null; + + } + + public static Map getFilterItems( + Block block, + int page + ) { + + Map items = + new HashMap<>(); + + int machineId = + getMachineId( + block + ); + + if (machineId == -1) { + + return items; + + } + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT slot, item_data + FROM machine_filters + WHERE machine_id = ? + AND page = ? + """ + ) + + ) { + + statement.setInt( + 1, + machineId + ); + + statement.setInt( + 2, + page + ); + + ResultSet result = + statement.executeQuery(); + + while (result.next()) { + + items.put( + + result.getInt( + "slot" + ), + + deserializeItemStack( + result.getString( + "item_data" + ) + ) + + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return items; + + } + + + + + + + public static Map getAllFilterItems( + Block block + ) { + + Map items = + new HashMap<>(); + + int machineId = + getMachineId( + block + ); + + if (machineId == -1) { + + return items; + + } + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT page, + slot, + item_data + FROM machine_filters + WHERE machine_id = ? + """ + ) + + ) { + + statement.setInt( + 1, + machineId + ); + + ResultSet result = + statement.executeQuery(); + + while (result.next()) { + + int page = + result.getInt( + "page" + ); + + int slot = + result.getInt( + "slot" + ); + + items.put( + + (page * 1000) + slot, + + deserializeItemStack( + result.getString( + "item_data" + ) + ) + + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return items; + + } + + public static int getHighestFilterPage( + Block block + ) { + + int machineId = + getMachineId( + block + ); + + if (machineId == -1) { + + return 1; + + } + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT MAX(page) + FROM machine_filters + WHERE machine_id = ? + """ + ) + + ) { + + statement.setInt( + 1, + machineId + ); + + ResultSet result = + statement.executeQuery(); + + if (result.next()) { + + int page = + result.getInt( + 1 + ); + + return Math.max( + page, + 1 + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return 1; + + } + + public static void setMachineState( + Block block, + MachineState state + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE machines + SET state = ? + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + """ + ) + + ) { + + statement.setString( + 1, + state.name() + ); + + statement.setString( + 2, + block.getWorld().getName() + ); + + statement.setInt( + 3, + block.getX() + ); + + statement.setInt( + 4, + block.getY() + ); + + statement.setInt( + 5, + block.getZ() + ); + + statement.executeUpdate(); + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static MachineState getMachineState( + Block block + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT state + FROM machines + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + LIMIT 1 + """ + ) + + ) { + + statement.setString( + 1, + block.getWorld().getName() + ); + + statement.setInt( + 2, + block.getX() + ); + + statement.setInt( + 3, + block.getY() + ); + + statement.setInt( + 4, + block.getZ() + ); + + ResultSet result = + statement.executeQuery(); + + if (result.next()) { + + return MachineState.valueOf( + result.getString( + "state" + ) + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return MachineState.ACTIVE; + + } + + public static void setMachineError( + Block block, + MachineError error + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE machines + SET error_reason = ? + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + """ + ) + + ) { + + statement.setString( + 1, + error.name() + ); + + statement.setString( + 2, + block.getWorld().getName() + ); + + statement.setInt( + 3, + block.getX() + ); + + statement.setInt( + 4, + block.getY() + ); + + statement.setInt( + 5, + block.getZ() + ); + + statement.executeUpdate(); + + if (error != MachineError.NONE) { + + setMachineState( + block, + MachineState.ERROR + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + } + + public static MachineError getMachineError( + Block block + ) { + + try ( + + Connection connection = + DatabaseManager.getConnection(); + + PreparedStatement statement = + connection.prepareStatement( + """ + SELECT error_reason + FROM machines + WHERE world = ? + AND x = ? + AND y = ? + AND z = ? + LIMIT 1 + """ + ) + + ) { + + statement.setString( + 1, + block.getWorld().getName() + ); + + statement.setInt( + 2, + block.getX() + ); + + statement.setInt( + 3, + block.getY() + ); + + statement.setInt( + 4, + block.getZ() + ); + + ResultSet result = + statement.executeQuery(); + + if (result.next()) { + + String error = + result.getString( + "error_reason" + ); + + if (error == null + || error.isEmpty()) { + + return MachineError.NONE; + + } + + return MachineError.valueOf( + error + ); + + } + + } + + catch (Exception e) { + + e.printStackTrace(); + + } + + return MachineError.NONE; + + } + + public static void clearMachineError( + Block block + ) { + + setMachineError( + block, + MachineError.NONE + ); + + if (getMachineState( + block + ) == MachineState.ERROR) { + + setMachineState( + block, + MachineState.ACTIVE + ); + + } + + } + + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/managers/RSConversionManager.java b/src/main/java/com/rsscripting/rsauger/managers/RSConversionManager.java new file mode 100644 index 0000000..13441aa --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/managers/RSConversionManager.java @@ -0,0 +1,41 @@ +package com.rsscripting.rsauger.managers; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.block.Block; + +import java.util.Map; + +public class RSConversionManager { + + public static boolean containsFilterItem( + Block block, + ItemStack item + ) { + + Map filterItems = + MachineManager.getAllFilterItems( + block + ); + + for (ItemStack filterItem + : filterItems.values()) { + + if (filterItem == null) { + continue; + } + + if (filterItem.isSimilar( + item + )) { + + return true; + + } + + } + + return false; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/utils/GitHubUpdateChecker.java b/src/main/java/com/rsscripting/rsauger/utils/GitHubUpdateChecker.java new file mode 100644 index 0000000..f315bfc --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/utils/GitHubUpdateChecker.java @@ -0,0 +1,177 @@ +package com.rsscripting.rsauger.utils; + +import com.rsscripting.rsauger.RSAuger; +import org.bukkit.Bukkit; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URI; + +public class GitHubUpdateChecker { + + /* + |-------------------------------------------------------------------------- + | UPDATE STATUS + |-------------------------------------------------------------------------- + */ + + private static String latestVersion = null; + + private static String updateStatus = + "Checking..."; + + /* + |-------------------------------------------------------------------------- + | CHECK FOR UPDATES + |-------------------------------------------------------------------------- + */ + + public static void checkForUpdates() { + + Bukkit.getScheduler().runTaskAsynchronously( + + RSAuger.getInstance(), + + () -> { + + try { + + String apiURL = + "https://api.github.com/repos/" + + RSConstants.GITHUB_USER + + "/" + + RSConstants.GITHUB_REPOSITORY + + "/releases/latest"; + + HttpURLConnection connection = + (HttpURLConnection) + URI.create(apiURL) + .toURL() + .openConnection(); + + connection.setRequestMethod("GET"); + + BufferedReader reader = + new BufferedReader( + new InputStreamReader( + connection.getInputStream() + ) + ); + + StringBuilder response = + new StringBuilder(); + + String line; + + while ((line = reader.readLine()) != null) { + + response.append(line); + + } + + reader.close(); + + String json = + response.toString(); + + latestVersion = + json.split("\"tag_name\":\"")[1] + .split("\"")[0]; + + String currentVersion = + VersionUtils.getVersion(); + + /* + |-------------------------------------------------------------------------- + | UPDATE AVAILABLE + |-------------------------------------------------------------------------- + */ + + if (!latestVersion.equalsIgnoreCase( + currentVersion + )) { + + updateStatus = + "Update Available"; + + Bukkit.getConsoleSender().sendMessage( + + RSConstants.PREFIX + + "Update available: " + + latestVersion + + " (Current: " + + currentVersion + + ")" + + ); + + } + + /* + |-------------------------------------------------------------------------- + | UP TO DATE + |-------------------------------------------------------------------------- + */ + + else { + + updateStatus = + "Up To Date"; + + Bukkit.getConsoleSender().sendMessage( + + RSConstants.PREFIX + + "Plugin is up to date." + + ); + + } + + } + + catch (Exception exception) { + + updateStatus = + "Unable To Check"; + + Bukkit.getConsoleSender().sendMessage( + + RSConstants.PREFIX + + "Failed to check for updates." + + ); + + } + + } + + ); + + } + + /* + |-------------------------------------------------------------------------- + | GET LATEST VERSION + |-------------------------------------------------------------------------- + */ + + public static String getLatestVersion() { + + return latestVersion; + + } + + /* + |-------------------------------------------------------------------------- + | GET UPDATE STATUS + |-------------------------------------------------------------------------- + */ + + public static String getUpdateStatus() { + + return updateStatus; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/utils/RSConstants.java b/src/main/java/com/rsscripting/rsauger/utils/RSConstants.java new file mode 100644 index 0000000..a0308ee --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/utils/RSConstants.java @@ -0,0 +1,83 @@ +package com.rsscripting.rsauger.utils; + +import org.bukkit.Material; + +public class RSConstants { + + /* + |-------------------------------------------------------------------------- + | PLUGIN INFO + |-------------------------------------------------------------------------- + */ + + public static final String PLUGIN_NAME = + "RS-Auger"; + + public static final String PREFIX = + "§7[§cRS-RSAuger§7] §r"; + + public static final String COMMAND_ALIAS = + "rsauger"; + + /* + |-------------------------------------------------------------------------- + | GITHUB + |-------------------------------------------------------------------------- + */ + + public static final String GITHUB_USER = + "YourGitHubUsername"; + + public static final String GITHUB_REPOSITORY = + "RS-ItemMagnet"; + + /* + |-------------------------------------------------------------------------- + | PERMISSIONS + |-------------------------------------------------------------------------- + */ + + public static final String ADMIN_PERMISSION = + "rsauger.admin"; + + public static final String BYPASS_PERMISSION = + "rsauger.bypass"; + + /* + |-------------------------------------------------------------------------- + | REQUIRED CONVERSION ITEMS + |-------------------------------------------------------------------------- + */ + + public static final Material REQUIRED_HELD_ITEM = + Material.STICK; + + /* + |-------------------------------------------------------------------------- + | REQUIRED TARGET ENTITY + |-------------------------------------------------------------------------- + */ + + public static final Material + REQUIRED_TARGET_BLOCK = + Material.LODESTONE; + + /* + |-------------------------------------------------------------------------- + | MENU SETTINGS + |-------------------------------------------------------------------------- + */ + + public static final Material MENU_FILLER_MATERIAL = + Material.WHITE_STAINED_GLASS_PANE; + + /* + |-------------------------------------------------------------------------- + | Version + |-------------------------------------------------------------------------- + */ + + public static final String VERSION = + "1.0.0"; + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/utils/RSKeys.java b/src/main/java/com/rsscripting/rsauger/utils/RSKeys.java new file mode 100644 index 0000000..0545c2a --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/utils/RSKeys.java @@ -0,0 +1,20 @@ +package com.rsscripting.rsauger.utils; + +public class RSKeys { + + /* + |-------------------------------------------------------------------------- + | FILTER MODES + |-------------------------------------------------------------------------- + */ + + public static final String FILTER_ALLOW_ALL = + "allow_all"; + + public static final String FILTER_WHITELIST = + "whitelist"; + + public static final String FILTER_BLACKLIST = + "blacklist"; + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/utils/RSMenuUtils.java b/src/main/java/com/rsscripting/rsauger/utils/RSMenuUtils.java new file mode 100644 index 0000000..a10c7cc --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/utils/RSMenuUtils.java @@ -0,0 +1,122 @@ +package com.rsscripting.rsauger.utils; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import net.kyori.adventure.text.Component; + +import java.util.List; + +public class RSMenuUtils { + + /* + |-------------------------------------------------------------------------- + | CREATE FILLER PANE + |-------------------------------------------------------------------------- + */ + + public static ItemStack createFillerPane() { + + ItemStack item = + new ItemStack( + RSConstants.MENU_FILLER_MATERIAL + ); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.displayName( + Component.empty() + ); + + item.setItemMeta(meta); + + } + + return item; + + } + + /* + |-------------------------------------------------------------------------- + | CREATE MENU ITEM + |-------------------------------------------------------------------------- + */ + + public static ItemStack createMenuItem( + + Material material, + + String name + + ) { + + ItemStack item = + new ItemStack(material); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.displayName( + Component.text( + name + ) + ); + + item.setItemMeta(meta); + + } + + return item; + + } + + /* + |-------------------------------------------------------------------------- + | CREATE MENU ITEM WITH LORE + |-------------------------------------------------------------------------- + */ + + public static ItemStack createMenuItem( + + Material material, + + String name, + + List lore + + ) { + + ItemStack item = + new ItemStack(material); + + ItemMeta meta = + item.getItemMeta(); + + if (meta != null) { + + meta.displayName( + Component.text( + name + ) + ); + + meta.lore( + lore.stream() + .map(Component::text) + .toList() + ); + + item.setItemMeta(meta); + + } + + return item; + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/utils/RSMessageUtils.java b/src/main/java/com/rsscripting/rsauger/utils/RSMessageUtils.java new file mode 100644 index 0000000..1992b6c --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/utils/RSMessageUtils.java @@ -0,0 +1,170 @@ +package com.rsscripting.rsauger.utils; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; + +public class RSMessageUtils { + + /* + |-------------------------------------------------------------------------- + | PREFIX + |-------------------------------------------------------------------------- + */ + + private static final Component PREFIX = + + Component.text("[") + .color(NamedTextColor.GRAY) + + .append( + Component.text( + "RS-Plugin" + ).color( + NamedTextColor.RED + ) + ) + + .append( + Component.text("] ") + .color( + NamedTextColor.GRAY + ) + ); + + /* + |-------------------------------------------------------------------------- + | SUCCESS + |-------------------------------------------------------------------------- + */ + + public static void success( + Player player, + String message + ) { + + player.sendMessage( + + PREFIX.append( + + Component.text( + message + ).color( + NamedTextColor.GREEN + ) + + ) + + ); + + } + + /* + |-------------------------------------------------------------------------- + | WARNING + |-------------------------------------------------------------------------- + */ + + public static void warning( + Player player, + String message + ) { + + player.sendMessage( + + PREFIX.append( + + Component.text( + message + ).color( + NamedTextColor.YELLOW + ) + + ) + + ); + + } + + /* + |-------------------------------------------------------------------------- + | ERROR + |-------------------------------------------------------------------------- + */ + + public static void error( + Player player, + String message + ) { + + player.sendMessage( + + PREFIX.append( + + Component.text( + message + ).color( + NamedTextColor.RED + ) + + ) + + ); + + } + + /* + |-------------------------------------------------------------------------- + | INFO + |-------------------------------------------------------------------------- + */ + + public static void info( + Player player, + String message + ) { + + player.sendMessage( + + PREFIX.append( + + Component.text( + message + ).color( + NamedTextColor.AQUA + ) + + ) + + ); + + } + + /* + |-------------------------------------------------------------------------- + | ADMIN + |-------------------------------------------------------------------------- + */ + + public static void admin( + Player player, + String message + ) { + + player.sendMessage( + + PREFIX.append( + + Component.text( + message + ).color( + NamedTextColor.GOLD + ) + + ) + + ); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/rsscripting/rsauger/utils/VersionUtils.java b/src/main/java/com/rsscripting/rsauger/utils/VersionUtils.java new file mode 100644 index 0000000..e82738d --- /dev/null +++ b/src/main/java/com/rsscripting/rsauger/utils/VersionUtils.java @@ -0,0 +1,20 @@ +package com.rsscripting.rsauger.utils; + +import com.rsscripting.rsauger.RSAuger; + +public class VersionUtils { + + /* + |-------------------------------------------------------------------------- + | GET INSTALLED VERSION + |-------------------------------------------------------------------------- + */ + + public static String getVersion() { + + return RSAuger.getInstance() + .getDescription() + .getVersion(); + } + +} \ No newline at end of file diff --git a/src/main/resources/ToDo.md b/src/main/resources/ToDo.md new file mode 100644 index 0000000..1a87a8b --- /dev/null +++ b/src/main/resources/ToDo.md @@ -0,0 +1,22 @@ +#### To Do list + +# Plugin Specific (RS-ItemMagnet) +- Refactor to RS-ItemMagnet. +- Set plugin name/version/permissions +- set up GitHub version for version checker. +- add in target assigned hopper on convert +- add in magnet logic +- add in filter logic + +# Optional (Needs discussion with partner) + +- identifier when RS-ItemMagnet inoperable. (Sparkles?) + + +# Additional menu options + +- Select new hopper target. + + + + diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..6de95c0 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,13 @@ +# +# ---------------------------------------- +# RS Plugin Template Configuration +# ---------------------------------------- +# + +debug-mode: false + +default-radius: 5 + +max-radius: 0 + +admin-bypass: true \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..43aceb5 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,21 @@ +name: RS-Auger +version: 1.0.0 +main: com.rsscripting.rsauger.RSAuger +api-version: '1.21' + +author: RSScripting +description: Lightning Rod item transport machine for the RS ecosystem + +commands: + rsauger: + description: Main plugin command + usage: /rsauger + +permissions: + rsauger.admin: + description: Admin access + default: op + + rsauger.bypass: + description: Bypass ownership protection + default: op \ No newline at end of file