diff --git a/build.gradle b/build.gradle index 3b507dc..b0c8147 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ plugins { sourceCompatibility = 1.8 targetCompatibility = 1.8 +compileJava.options.encoding = 'UTF-8' group = 'dev.esophose.playerparticles' version = '7.0' diff --git a/src/main/java/dev/esophose/playerparticles/PlayerParticles.java b/src/main/java/dev/esophose/playerparticles/PlayerParticles.java index e997821..e1106bb 100644 --- a/src/main/java/dev/esophose/playerparticles/PlayerParticles.java +++ b/src/main/java/dev/esophose/playerparticles/PlayerParticles.java @@ -15,170 +15,108 @@ package dev.esophose.playerparticles; -import java.io.File; - -import dev.esophose.playerparticles.command.ParticleCommandHandler; -import dev.esophose.playerparticles.database.DatabaseConnector; -import dev.esophose.playerparticles.database.MySqlDatabaseConnector; -import dev.esophose.playerparticles.database.SqliteDatabaseConnector; -import dev.esophose.playerparticles.gui.GuiHandler; import dev.esophose.playerparticles.gui.hook.PlayerChatHook; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; +import dev.esophose.playerparticles.manager.ConfigurationManager; +import dev.esophose.playerparticles.manager.DataMigrationManager; +import dev.esophose.playerparticles.manager.Manager; import dev.esophose.playerparticles.manager.ParticleManager; -import dev.esophose.playerparticles.manager.SettingManager; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; +import dev.esophose.playerparticles.manager.PluginUpdateManager; +import dev.esophose.playerparticles.manager.SettingManager.Setting; import dev.esophose.playerparticles.particles.PPlayerMovementListener; -import dev.esophose.playerparticles.styles.DefaultStyles; -import dev.esophose.playerparticles.updater.DataUpdater; -import dev.esophose.playerparticles.updater.PluginUpdateListener; -import dev.esophose.playerparticles.updater.Updater; import dev.esophose.playerparticles.util.Metrics; +import java.io.File; +import java.util.HashMap; +import java.util.Map; import org.bukkit.Bukkit; -import org.bukkit.command.PluginCommand; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; +/** + * @author Esophose + */ public class PlayerParticles extends JavaPlugin { /** * The running instance of PlayerParticles on the server */ - private static PlayerParticles pluginInstance; + private static PlayerParticles INSTANCE; - /** - * The version a new update has, will be null if the config has it disabled - * or if there is no new version + /* + * The plugin managers */ - private String updateVersion = null; - - /** - * The database connection manager - */ - private DatabaseConnector databaseConnector = null; - - /** - * The task that spawns the particles - */ - private BukkitTask particleTask = null; + private Map, Manager> managers; /** * Executes essential tasks for starting up the plugin */ + @Override public void onEnable() { - pluginInstance = (PlayerParticles) Bukkit.getServer().getPluginManager().getPlugin("PlayerParticles"); - - this.registerCommands(); + INSTANCE = this; PluginManager pm = Bukkit.getPluginManager(); - pm.registerEvents(new ParticleManager(), this); - pm.registerEvents(new PluginUpdateListener(), this); - pm.registerEvents(new GuiHandler(), this); pm.registerEvents(new PPlayerMovementListener(), this); pm.registerEvents(new PlayerChatHook(), this); - this.saveDefaultConfig(); - double configVersion = PSetting.VERSION.getDouble(); - double currentVersion = Double.parseDouble(this.getDescription().getVersion()); - boolean updatePluginSettings = configVersion < currentVersion; - if (updatePluginSettings) { - this.configureDatabase(PSetting.DATABASE_ENABLE.getBoolean()); - DataUpdater.updateData(configVersion, currentVersion); - this.databaseConnector.closeConnection(); - this.databaseConnector = null; - - File configFile = new File(this.getDataFolder(), "config.yml"); - if (configFile.exists()) { - configFile.delete(); - } - this.saveDefaultConfig(); - this.reloadConfig(); - this.getLogger().warning("The config.yml has been updated to v" + this.getDescription().getVersion() + "!"); - } - - if (PSetting.CHECK_UPDATES.getBoolean()) { - Bukkit.getScheduler().runTaskAsynchronously(this, () -> { - try { // This can throw an exception if the server has no internet connection or if the Curse API is down - Updater updater = new Updater(pluginInstance, 82823, getFile(), Updater.UpdateType.NO_DOWNLOAD, false); - if (Double.parseDouble(updater.getLatestName().replaceAll("PlayerParticles v", "")) > Double.parseDouble(getPlugin().getDescription().getVersion())) { - updateVersion = updater.getLatestName().replaceAll("PlayerParticles v", ""); - getLogger().info("An update (v" + updateVersion + ") is available! You are running v" + getPlugin().getDescription().getVersion()); - } - } catch (Exception e) { - getLogger().warning("An error occurred checking for an update. There is either no established internet connection or the Curse API is down."); - } - }); - } + this.managers = new HashMap<>(); - if (PSetting.SEND_METRICS.getBoolean()) { + if (Setting.SEND_METRICS.getBoolean()) new Metrics(this); - } - - this.reload(updatePluginSettings); + + this.reload(); } - /** - * Clean up database connection if it's open - * Close all users with an open PlayerParticles GUI - */ + @Override public void onDisable() { - this.databaseConnector.closeConnection(); - GuiHandler.forceCloseAllOpenGUIs(); + this.managers.values().forEach(Manager::disable); + this.managers.clear(); } - - /** - * Registers the commands for the plugin - */ - private void registerCommands() { - ParticleCommandHandler pch = new ParticleCommandHandler(); - PluginCommand pp = this.getCommand("pp"); - PluginCommand ppo = this.getCommand("ppo"); - if (pp == null || ppo == null) { - Bukkit.getPluginManager().disablePlugin(this); - return; + /** + * Gets a manager instance + * + * @param managerClass The class of the manager instance to get + * @param The manager type + * @return The manager instance or null if one does not exist + */ + @SuppressWarnings("unchecked") + public T getManager(Class managerClass) { + if (this.managers.containsKey(managerClass)) + return (T) this.managers.get(managerClass); + + try { + T manager = managerClass.getConstructor(this.getClass()).newInstance(this); + this.managers.put(managerClass, manager); + manager.reload(); + return manager; + } catch (ReflectiveOperationException ex) { + ex.printStackTrace(); + return null; } - - pp.setTabCompleter(pch); - pp.setExecutor(pch); - ppo.setTabCompleter(pch); - ppo.setExecutor(pch); + } + + /** + * Returns the file which contains this plugin + * Exposes the JavaPlugin.getFile() method + * + * @return File containing this plugin + */ + public File getJarFile() { + return this.getFile(); } /** - * Reloads the settings of the plugin - * - * @param updatePluginSettings True if the settings should be updated to the latest version of the plugin + * Reloads the plugin */ - public void reload(boolean updatePluginSettings) { - this.reloadConfig(); - - // If not null, plugin is already loaded - if (this.particleTask != null) { - this.particleTask.cancel(); - this.particleTask = null; - this.databaseConnector.closeConnection(); - this.databaseConnector = null; - GuiHandler.forceCloseAllOpenGUIs(); - } else { - DefaultStyles.registerStyles(); // Only ever load styles once - } - - // This runs before the SettingManager is reloaded, the credentials will not be stored in memory for more than a few milliseconds - this.configureDatabase(PSetting.DATABASE_ENABLE.getBoolean()); - DataUpdater.tryCreateTables(); - - SettingManager.reload(); - LangManager.reload(updatePluginSettings); - ParticleGroupPresetManager.reload(); - - GuiHandler.setup(); + public void reload() { + this.managers.values().forEach(Manager::disable); + this.managers.clear(); + + this.getManager(ConfigurationManager.class); + this.getManager(DataMigrationManager.class); + this.getManager(PluginUpdateManager.class); + this.getManager(ParticleManager.class); + PlayerChatHook.setup(); - - ParticleManager.refreshData(); - this.startParticleTask(); } /** @@ -186,61 +124,8 @@ public class PlayerParticles extends JavaPlugin { * * @return The PlayerParticles plugin instance */ - public static PlayerParticles getPlugin() { - return pluginInstance; - } - - /** - * Gets the DatabaseConnector that allows querying the database - * - * @return The DatabaseConnector - */ - public DatabaseConnector getDBConnector() { - return this.databaseConnector; - } - - /** - * Gets the latest available version of the plugin - * Will be null if no update is available - * - * @return The latest version available for the plugin - */ - public String getUpdateVersion() { - return this.updateVersion; - } - - /** - * Determines if we should use MySQL or SQLite based on the useMySql parameter and if we were able to connect successfully - * - * @param useMySql If we should use MySQL as the database type, if false, uses SQLite - */ - private void configureDatabase(boolean useMySql) { - if (useMySql) { - this.databaseConnector = new MySqlDatabaseConnector(); - } else { - try { - Class.forName("org.sqlite.JDBC"); // This is required to put here for Spigot 1.9 and 1.10 for some reason - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - this.databaseConnector = new SqliteDatabaseConnector(this.getDataFolder().getAbsolutePath()); - } - - if (!this.databaseConnector.isInitialized()) { - this.getLogger().severe("Unable to connect to the MySQL database! Is your login information correct? Falling back to SQLite database instead."); - this.configureDatabase(false); - } - } - - /** - * Starts the task responsible for spawning particles - * Run in the synchronous task so it starts after all plugins have loaded, including extensions - */ - private void startParticleTask() { - Bukkit.getScheduler().runTaskLater(pluginInstance, () -> { - long ticks = PSetting.TICKS_PER_PARTICLE.getLong(); - this.particleTask = new ParticleManager().runTaskTimer(pluginInstance, 5, ticks); - }, 1); + public static PlayerParticles getInstance() { + return INSTANCE; } } diff --git a/src/main/java/dev/esophose/playerparticles/api/PlayerParticlesAPI.java b/src/main/java/dev/esophose/playerparticles/api/PlayerParticlesAPI.java new file mode 100644 index 0000000..16d317e --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/api/PlayerParticlesAPI.java @@ -0,0 +1,7 @@ +package dev.esophose.playerparticles.api; + +public final class PlayerParticlesAPI { + + + +} diff --git a/src/main/java/dev/esophose/playerparticles/command/AddCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/AddCommandModule.java index 991267a..d02311a 100644 --- a/src/main/java/dev/esophose/playerparticles/command/AddCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/AddCommandModule.java @@ -3,8 +3,9 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.styles.api.ParticleStyle; -import dev.esophose.playerparticles.styles.api.ParticleStyleManager; +import dev.esophose.playerparticles.manager.ParticleStyleManager; import dev.esophose.playerparticles.util.ParticleUtils; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -29,8 +30,10 @@ public class AddCommandModule implements CommandModule { CommandModule.printUsage(pplayer, this); return; } + + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); - int maxParticlesAllowed = PermissionManager.getMaxParticlesAllowed(pplayer.getPlayer()); + int maxParticlesAllowed = permissionManager.getMaxParticlesAllowed(pplayer.getPlayer()); if (pplayer.getActiveParticles().size() >= maxParticlesAllowed) { LangManager.sendMessage(pplayer, Lang.ADD_REACHED_MAX, maxParticlesAllowed); return; @@ -40,7 +43,7 @@ public class AddCommandModule implements CommandModule { if (effect == null) { LangManager.sendMessage(pplayer, Lang.EFFECT_INVALID, args[0]); return; - } else if (!PermissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { + } else if (!permissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { LangManager.sendMessage(pplayer, Lang.EFFECT_NO_PERMISSION, effect.getName()); return; } @@ -49,7 +52,7 @@ public class AddCommandModule implements CommandModule { if (style == null) { LangManager.sendMessage(pplayer, Lang.STYLE_INVALID, args[1]); return; - } else if (!PermissionManager.hasStylePermission(pplayer.getPlayer(), style)) { + } else if (!permissionManager.hasStylePermission(pplayer.getPlayer(), style)) { LangManager.sendMessage(pplayer, Lang.STYLE_NO_PERMISSION, args[1]); return; } @@ -131,11 +134,11 @@ public class AddCommandModule implements CommandModule { ParticleGroup group = pplayer.getActiveParticleGroup(); ParticlePair newParticle = new ParticlePair(pplayer.getUniqueId(), pplayer.getNextActiveParticleId(), effect, style, itemData, blockData, colorData, noteColorData); group.getParticles().add(newParticle); - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), group); LangManager.sendMessage(pplayer, Lang.ADD_PARTICLE_APPLIED, newParticle.getEffect().getName(), newParticle.getStyle().getName(), newParticle.getDataString()); - if (ParticleStyleManager.isCustomHandled(newParticle.getStyle())) { + if (PlayerParticles.getInstance().getManager(ParticleStyleManager.class).isCustomHandled(newParticle.getStyle())) { LangManager.sendMessage(pplayer, Lang.STYLE_EVENT_SPAWNING_INFO, newParticle.getStyle().getName()); } } @@ -143,12 +146,13 @@ public class AddCommandModule implements CommandModule { public List onTabComplete(PPlayer pplayer, String[] args) { Player p = pplayer.getPlayer(); List matches = new ArrayList<>(); + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); if (args.length <= 1) { // Effect name - if (args.length == 0) matches = PermissionManager.getEffectNamesUserHasPermissionFor(p); - else StringUtil.copyPartialMatches(args[0], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches); + if (args.length == 0) matches = permissionManager.getEffectNamesUserHasPermissionFor(p); + else StringUtil.copyPartialMatches(args[0], permissionManager.getEffectNamesUserHasPermissionFor(p), matches); } else if (args.length == 2) { // Style name - StringUtil.copyPartialMatches(args[1], PermissionManager.getStyleNamesUserHasPermissionFor(p), matches); + StringUtil.copyPartialMatches(args[1], permissionManager.getStyleNamesUserHasPermissionFor(p), matches); } else { // Data ParticleEffect effect = ParticleEffect.fromName(args[0]); if (effect != null) { @@ -191,8 +195,8 @@ public class AddCommandModule implements CommandModule { return "add"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_ADD; + public String getDescriptionKey() { + return "command-description-add"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/CommandModule.java b/src/main/java/dev/esophose/playerparticles/command/CommandModule.java index 6b67758..e4846fa 100644 --- a/src/main/java/dev/esophose/playerparticles/command/CommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/CommandModule.java @@ -33,11 +33,11 @@ public interface CommandModule { String getName(); /** - * Gets the Lang description of this command + * Gets the locale description key of this command * - * @return The description of this command + * @return The locale description key of this command */ - Lang getDescription(); + String getDescriptionKey(); /** * Gets any arguments this command has diff --git a/src/main/java/dev/esophose/playerparticles/command/DataCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/DataCommandModule.java index 18264e9..0e842b9 100644 --- a/src/main/java/dev/esophose/playerparticles/command/DataCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/DataCommandModule.java @@ -3,6 +3,7 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import org.bukkit.util.StringUtil; import dev.esophose.playerparticles.manager.LangManager; @@ -43,10 +44,14 @@ public class DataCommandModule implements CommandModule { } public List onTabComplete(PPlayer pplayer, String[] args) { + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); List matches = new ArrayList<>(); if (args.length <= 1) { - if (args.length == 0) matches = PermissionManager.getEffectNamesUserHasPermissionFor(pplayer.getPlayer()); - else StringUtil.copyPartialMatches(args[0], PermissionManager.getEffectNamesUserHasPermissionFor(pplayer.getPlayer()), matches); + if (args.length == 0) { + matches = permissionManager.getEffectNamesUserHasPermissionFor(pplayer.getPlayer()); + } else { + StringUtil.copyPartialMatches(args[0], permissionManager.getEffectNamesUserHasPermissionFor(pplayer.getPlayer()), matches); + } } return matches; } @@ -55,8 +60,8 @@ public class DataCommandModule implements CommandModule { return "data"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_DATA; + public String getDescriptionKey() { + return "command-description-data"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/DefaultCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/DefaultCommandModule.java index 1d74de1..1d8847e 100644 --- a/src/main/java/dev/esophose/playerparticles/command/DefaultCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/DefaultCommandModule.java @@ -3,6 +3,8 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.CommandManager; import org.bukkit.util.StringUtil; import dev.esophose.playerparticles.manager.LangManager.Lang; @@ -12,12 +14,12 @@ public class DefaultCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { // The default command just opens the GUI, execute the GUICommandModule - ParticleCommandHandler.findMatchingCommand("gui").onCommandExecute(pplayer, new String[] { "_byDefault_" }); + PlayerParticles.getInstance().getManager(CommandManager.class).findMatchingCommand("gui").onCommandExecute(pplayer, new String[] { "_byDefault_" }); } public List onTabComplete(PPlayer pplayer, String[] args) { List matches = new ArrayList<>(); - List commandNames = ParticleCommandHandler.getCommandNames(); + List commandNames = PlayerParticles.getInstance().getManager(CommandManager.class).getCommandNames(); if (args.length == 0) return commandNames; @@ -30,8 +32,8 @@ public class DefaultCommandModule implements CommandModule { return ""; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_DEFAULT; + public String getDescriptionKey() { + return "command-description-default"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/EditCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/EditCommandModule.java index b873cdd..375f74c 100644 --- a/src/main/java/dev/esophose/playerparticles/command/EditCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/EditCommandModule.java @@ -3,6 +3,7 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.styles.api.ParticleStyle; import dev.esophose.playerparticles.util.ParticleUtils; import org.bukkit.Material; @@ -78,7 +79,7 @@ public class EditCommandModule implements CommandModule { if (effect == null) { LangManager.sendMessage(pplayer, Lang.EFFECT_INVALID, args[0]); return; - } else if (!PermissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { + } else if (!PlayerParticles.getInstance().getManager(PermissionManager.class).hasEffectPermission(pplayer.getPlayer(), effect)) { LangManager.sendMessage(pplayer, Lang.EFFECT_NO_PERMISSION, effect.getName()); return; } @@ -91,7 +92,7 @@ public class EditCommandModule implements CommandModule { } } - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), group); LangManager.sendMessage(pplayer, Lang.EDIT_SUCCESS_EFFECT, id, effect.getName()); } @@ -107,7 +108,7 @@ public class EditCommandModule implements CommandModule { if (style == null) { LangManager.sendMessage(pplayer, Lang.STYLE_INVALID, args[0]); return; - } else if (!PermissionManager.hasStylePermission(pplayer.getPlayer(), style)) { + } else if (!PlayerParticles.getInstance().getManager(PermissionManager.class).hasStylePermission(pplayer.getPlayer(), style)) { LangManager.sendMessage(pplayer, Lang.STYLE_NO_PERMISSION, style.getName()); return; } @@ -119,8 +120,8 @@ public class EditCommandModule implements CommandModule { break; } } - - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), group); LangManager.sendMessage(pplayer, Lang.EDIT_SUCCESS_STYLE, id, style.getName()); } @@ -218,12 +219,13 @@ public class EditCommandModule implements CommandModule { break; } } - - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), group); LangManager.sendMessage(pplayer, Lang.EDIT_SUCCESS_DATA, id, updatedDataString); } public List onTabComplete(PPlayer pplayer, String[] args) { + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); Player p = pplayer.getPlayer(); List matches = new ArrayList<>(); List ids = new ArrayList<>(); @@ -253,11 +255,11 @@ public class EditCommandModule implements CommandModule { switch (args[1].toLowerCase()) { case "effect": if (args.length == 3) - StringUtil.copyPartialMatches(args[2], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches); + StringUtil.copyPartialMatches(args[2], permissionManager.getEffectNamesUserHasPermissionFor(p), matches); break; case "style": if (args.length == 3) - StringUtil.copyPartialMatches(args[2], PermissionManager.getStyleNamesUserHasPermissionFor(p), matches); + StringUtil.copyPartialMatches(args[2], permissionManager.getStyleNamesUserHasPermissionFor(p), matches); break; case "data": ParticleEffect effect = pplayer.getActiveParticle(id).getEffect(); @@ -302,8 +304,8 @@ public class EditCommandModule implements CommandModule { return "edit"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_EDIT; + public String getDescriptionKey() { + return "command-description-edit"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/EffectsCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/EffectsCommandModule.java index c4ba7d6..633dc59 100644 --- a/src/main/java/dev/esophose/playerparticles/command/EffectsCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/EffectsCommandModule.java @@ -3,6 +3,7 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import org.bukkit.entity.Player; import dev.esophose.playerparticles.manager.LangManager; @@ -15,7 +16,7 @@ public class EffectsCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { Player p = pplayer.getPlayer(); - List effectList = PermissionManager.getEffectNamesUserHasPermissionFor(p); + List effectList = PlayerParticles.getInstance().getManager(PermissionManager.class).getEffectNamesUserHasPermissionFor(p); if (effectList.isEmpty()) { LangManager.sendMessage(pplayer, Lang.EFFECT_LIST_EMPTY); return; @@ -41,8 +42,8 @@ public class EffectsCommandModule implements CommandModule { return "effects"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_EFFECTS; + public String getDescriptionKey() { + return "command-description-effects"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/FixedCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/FixedCommandModule.java index 0d79a89..fd29759 100644 --- a/src/main/java/dev/esophose/playerparticles/command/FixedCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/FixedCommandModule.java @@ -1,21 +1,6 @@ package dev.esophose.playerparticles.command; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import dev.esophose.playerparticles.styles.api.ParticleStyle; -import dev.esophose.playerparticles.util.ParticleUtils; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; - +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.DataManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; @@ -28,13 +13,28 @@ import dev.esophose.playerparticles.particles.ParticleEffect.NoteColor; import dev.esophose.playerparticles.particles.ParticleEffect.OrdinaryColor; import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty; import dev.esophose.playerparticles.particles.ParticlePair; +import dev.esophose.playerparticles.styles.api.ParticleStyle; +import dev.esophose.playerparticles.util.ParticleUtils; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; public class FixedCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { Player p = pplayer.getPlayer(); - if (!PermissionManager.canUseFixedEffects(p)) { + if (!PlayerParticles.getInstance().getManager(PermissionManager.class).canUseFixedEffects(p)) { LangManager.sendMessage(pplayer, Lang.FIXED_NO_PERMISSION); return; } @@ -92,7 +92,8 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleCreate(PPlayer pplayer, Player p, String[] args) { - boolean reachedMax = PermissionManager.hasPlayerReachedMaxFixedEffects(pplayer); + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + boolean reachedMax = permissionManager.hasPlayerReachedMaxFixedEffects(pplayer); if (reachedMax) { LangManager.sendMessage(pplayer, Lang.FIXED_MAX_REACHED); return; @@ -155,7 +156,7 @@ public class FixedCommandModule implements CommandModule { } double distanceFromEffect = p.getLocation().distance(new Location(p.getWorld(), xPos, yPos, zPos)); - int maxCreationDistance = PermissionManager.getMaxFixedEffectCreationDistance(); + int maxCreationDistance = permissionManager.getMaxFixedEffectCreationDistance(); if (maxCreationDistance != 0 && distanceFromEffect > maxCreationDistance) { LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_OUT_OF_RANGE, maxCreationDistance); return; @@ -165,7 +166,7 @@ public class FixedCommandModule implements CommandModule { if (effect == null) { LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_EFFECT_INVALID, args[3]); return; - } else if (!PermissionManager.hasEffectPermission(p, effect)) { + } else if (!permissionManager.hasEffectPermission(p, effect)) { LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_EFFECT_NO_PERMISSION, effect.getName()); return; } @@ -174,7 +175,7 @@ public class FixedCommandModule implements CommandModule { if (style == null) { LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_STYLE_INVALID, args[4]); return; - } else if (!PermissionManager.hasStylePermission(p, style)) { + } else if (!permissionManager.hasStylePermission(p, style)) { LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_STYLE_NO_PERMISSION, args[4]); return; } @@ -271,7 +272,7 @@ public class FixedCommandModule implements CommandModule { FixedParticleEffect fixedEffect = new FixedParticleEffect(p.getUniqueId(), nextFixedEffectId, p.getLocation().getWorld().getName(), xPos, yPos, zPos, particle); LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_SUCCESS); - DataManager.saveFixedEffect(fixedEffect); + PlayerParticles.getInstance().getManager(DataManager.class).saveFixedEffect(fixedEffect); } /** @@ -282,6 +283,8 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleEdit(PPlayer pplayer, Player p, String[] args) { + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + if (args.length < 3) { LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_MISSING_ARGS); return; @@ -348,7 +351,7 @@ public class FixedCommandModule implements CommandModule { } double distanceFromEffect = p.getLocation().distance(new Location(p.getWorld(), xPos, yPos, zPos)); - int maxCreationDistance = PermissionManager.getMaxFixedEffectCreationDistance(); + int maxCreationDistance = permissionManager.getMaxFixedEffectCreationDistance(); if (maxCreationDistance != 0 && distanceFromEffect > maxCreationDistance) { LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_OUT_OF_RANGE, maxCreationDistance); return; @@ -361,7 +364,7 @@ public class FixedCommandModule implements CommandModule { if (effect == null) { LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_EFFECT_INVALID, args[2]); return; - } else if (!PermissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { + } else if (!permissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_EFFECT_NO_PERMISSION, effect.getName()); return; } @@ -374,7 +377,7 @@ public class FixedCommandModule implements CommandModule { if (style == null) { LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_STYLE_INVALID, args[2]); return; - } else if (!PermissionManager.hasStylePermission(pplayer.getPlayer(), style)) { + } else if (!permissionManager.hasStylePermission(pplayer.getPlayer(), style)) { LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_STYLE_NO_PERMISSION, style.getName()); return; } else if (!style.canBeFixed()) { @@ -480,7 +483,7 @@ public class FixedCommandModule implements CommandModule { return; } - DataManager.updateFixedEffect(fixedEffect); + PlayerParticles.getInstance().getManager(DataManager.class).updateFixedEffect(fixedEffect); LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_SUCCESS, editType, id); } @@ -506,7 +509,7 @@ public class FixedCommandModule implements CommandModule { } if (pplayer.getFixedEffectById(id) != null) { - DataManager.removeFixedEffect(pplayer.getUniqueId(), id); + PlayerParticles.getInstance().getManager(DataManager.class).removeFixedEffect(pplayer.getUniqueId(), id); LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_SUCCESS, id); } else { LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_INVALID, id); @@ -591,7 +594,11 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleClear(PPlayer pplayer, Player p, String[] args) { - if (!PermissionManager.canClearFixedEffects(p)) { + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + + if (!permissionManager.canClearFixedEffects(p)) { LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_NO_PERMISSION); return; } @@ -611,18 +618,19 @@ public class FixedCommandModule implements CommandModule { ArrayList fixedEffectsToRemove = new ArrayList<>(); - for (PPlayer ppl : ParticleManager.getPPlayers()) + for (PPlayer ppl : particleManager.getPPlayers()) for (FixedParticleEffect fixedEffect : ppl.getFixedParticles()) - if (fixedEffect.getLocation().getWorld().equals(p.getLocation().getWorld()) && fixedEffect.getLocation().distance(p.getLocation()) <= radius) + if (fixedEffect.getLocation().getWorld() == p.getLocation().getWorld() && fixedEffect.getLocation().distance(p.getLocation()) <= radius) fixedEffectsToRemove.add(fixedEffect); for (FixedParticleEffect fixedEffect : fixedEffectsToRemove) - DataManager.removeFixedEffect(fixedEffect.getOwnerUniqueId(), fixedEffect.getId()); + dataManager.removeFixedEffect(fixedEffect.getOwnerUniqueId(), fixedEffect.getId()); LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_SUCCESS, fixedEffectsToRemove.size(), radius); } public List onTabComplete(PPlayer pplayer, String[] args) { + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); Player p = pplayer.getPlayer(); List matches = new ArrayList<>(); @@ -657,9 +665,9 @@ public class FixedCommandModule implements CommandModule { } if (args.length == 5) { - StringUtil.copyPartialMatches(args[4], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches); + StringUtil.copyPartialMatches(args[4], permissionManager.getEffectNamesUserHasPermissionFor(p), matches); } else if (args.length == 6) { - StringUtil.copyPartialMatches(args[5], PermissionManager.getFixableStyleNamesUserHasPermissionFor(p), matches); + StringUtil.copyPartialMatches(args[5], permissionManager.getFixableStyleNamesUserHasPermissionFor(p), matches); } else if (args.length >= 7) { ParticleEffect effect = ParticleEffect.fromName(args[4]); if (effect != null) { @@ -717,9 +725,9 @@ public class FixedCommandModule implements CommandModule { } StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches); } else if (property.equals("effect") && args.length == 4) { - StringUtil.copyPartialMatches(args[3], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches); + StringUtil.copyPartialMatches(args[3], permissionManager.getEffectNamesUserHasPermissionFor(p), matches); } else if (property.equals("style") && args.length == 4) { - StringUtil.copyPartialMatches(args[3], PermissionManager.getFixableStyleNamesUserHasPermissionFor(p), matches); + StringUtil.copyPartialMatches(args[3], permissionManager.getFixableStyleNamesUserHasPermissionFor(p), matches); } else if (property.equals("data")) { int id = -1; try { @@ -781,8 +789,8 @@ public class FixedCommandModule implements CommandModule { return "fixed"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_FIXED; + public String getDescriptionKey() { + return "command-description-fixed"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/GUICommandModule.java b/src/main/java/dev/esophose/playerparticles/command/GUICommandModule.java index ae28180..237fb45 100644 --- a/src/main/java/dev/esophose/playerparticles/command/GUICommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/GUICommandModule.java @@ -1,15 +1,16 @@ package dev.esophose.playerparticles.command; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LangManager; +import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.manager.PermissionManager; +import dev.esophose.playerparticles.manager.SettingManager.Setting; +import dev.esophose.playerparticles.particles.PPlayer; + import java.util.ArrayList; import java.util.List; -import dev.esophose.playerparticles.gui.GuiHandler; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; -import dev.esophose.playerparticles.manager.PermissionManager; -import dev.esophose.playerparticles.particles.PPlayer; - public class GUICommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { @@ -18,7 +19,7 @@ public class GUICommandModule implements CommandModule { byDefault = true; } - if (GuiHandler.isGuiDisabled()) { + if (GuiManager.isGuiDisabled()) { if (byDefault) { LangManager.sendMessage(pplayer, Lang.COMMAND_ERROR_UNKNOWN); } else { @@ -27,7 +28,7 @@ public class GUICommandModule implements CommandModule { return; } - if (!PSetting.GUI_PRESETS_ONLY.getBoolean() && PermissionManager.getEffectNamesUserHasPermissionFor(pplayer.getPlayer()).isEmpty()) { + if (!Setting.GUI_PRESETS_ONLY.getBoolean() && PlayerParticles.getInstance().getManager(PermissionManager.class).getEffectNamesUserHasPermissionFor(pplayer.getPlayer()).isEmpty()) { if (byDefault) { LangManager.sendMessage(pplayer, Lang.COMMAND_ERROR_NO_EFFECTS); } else { @@ -36,7 +37,7 @@ public class GUICommandModule implements CommandModule { return; } - GuiHandler.openDefault(pplayer); + GuiManager.openDefault(pplayer); } public List onTabComplete(PPlayer pplayer, String[] args) { @@ -47,8 +48,8 @@ public class GUICommandModule implements CommandModule { return "gui"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_GUI; + public String getDescriptionKey() { + return "command-description-gui"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/GroupCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/GroupCommandModule.java index b9a14c5..d97542c 100644 --- a/src/main/java/dev/esophose/playerparticles/command/GroupCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/GroupCommandModule.java @@ -1,22 +1,22 @@ package dev.esophose.playerparticles.command; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; - -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; - +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.DataManager; import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticleGroupPreset; import dev.esophose.playerparticles.particles.ParticlePair; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; public class GroupCommandModule implements CommandModule { @@ -87,7 +87,7 @@ public class GroupCommandModule implements CommandModule { } // Check if they are creating a new group, if they are, check that they haven't gone over their limit - if (pplayer.getParticleGroupByName(groupName) == null && PermissionManager.hasPlayerReachedMaxGroups(pplayer)) { + if (pplayer.getParticleGroupByName(groupName) == null && PlayerParticles.getInstance().getManager(PermissionManager.class).hasPlayerReachedMaxGroups(pplayer)) { LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_REACHED_MAX); return; } @@ -105,7 +105,7 @@ public class GroupCommandModule implements CommandModule { } // Apply changes and notify player - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), group); if (groupUpdated) { LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_SUCCESS_OVERWRITE, groupName); } else { @@ -131,7 +131,7 @@ public class GroupCommandModule implements CommandModule { ParticleGroup group = pplayer.getParticleGroupByName(groupName); if (group == null) { // Didn't find a saved group, look at the presets - ParticleGroupPreset presetGroup = ParticleGroupPresetManager.getPresetGroup(groupName); + ParticleGroupPreset presetGroup = PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class).getPresetGroup(groupName); if (presetGroup == null) { LangManager.sendMessage(pplayer, Lang.GROUP_INVALID, groupName); return; @@ -158,7 +158,7 @@ public class GroupCommandModule implements CommandModule { activeGroup.getParticles().add(particle.clone()); // Update group and notify player - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), activeGroup); if (!isPreset) LangManager.sendMessage(pplayer, Lang.GROUP_LOAD_SUCCESS, activeGroup.getParticles().size(), groupName); @@ -182,7 +182,7 @@ public class GroupCommandModule implements CommandModule { ParticleGroup group = pplayer.getParticleGroupByName(groupName); if (group == null) { // Didn't find a saved group, look at the presets - ParticleGroupPreset presetGroup = ParticleGroupPresetManager.getPresetGroup(groupName); + ParticleGroupPreset presetGroup = PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class).getPresetGroup(groupName); if (presetGroup == null) { LangManager.sendMessage(pplayer, Lang.GROUP_INVALID, groupName); @@ -193,7 +193,7 @@ public class GroupCommandModule implements CommandModule { } // Delete the group and notify player - DataManager.removeParticleGroup(pplayer.getUniqueId(), group); + PlayerParticles.getInstance().getManager(DataManager.class).removeParticleGroup(pplayer.getUniqueId(), group); LangManager.sendMessage(pplayer, Lang.GROUP_REMOVE_SUCCESS, groupName); } @@ -213,7 +213,7 @@ public class GroupCommandModule implements CommandModule { ParticleGroup group = pplayer.getParticleGroupByName(groupName); if (group == null) { // Didn't find a saved group, look at the presets - ParticleGroupPreset presetGroup = ParticleGroupPresetManager.getPresetGroup(groupName); + ParticleGroupPreset presetGroup = PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class).getPresetGroup(groupName); if (presetGroup == null) { LangManager.sendMessage(pplayer, Lang.GROUP_INVALID, groupName); return; @@ -254,7 +254,7 @@ public class GroupCommandModule implements CommandModule { groupsList = new StringBuilder(groupsList.substring(0, groupsList.length() - 2)); StringBuilder presetsList = new StringBuilder(); - for (ParticleGroupPreset group : ParticleGroupPresetManager.getPresetGroupsForPlayer(pplayer.getPlayer())) + for (ParticleGroupPreset group : PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class).getPresetGroupsForPlayer(pplayer.getPlayer())) presetsList.append(group.getGroup().getName()).append(", "); if (presetsList.toString().endsWith(", ")) @@ -290,7 +290,7 @@ public class GroupCommandModule implements CommandModule { if (!group.getName().equals(ParticleGroup.DEFAULT_NAME)) groupNames.add(group.getName()); if (!args[0].equals("remove")) - for (ParticleGroupPreset group : ParticleGroupPresetManager.getPresetGroupsForPlayer(pplayer.getPlayer())) + for (ParticleGroupPreset group : PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class).getPresetGroupsForPlayer(pplayer.getPlayer())) groupNames.add(group.getGroup().getName()); StringUtil.copyPartialMatches(args[1], groupNames, matches); } @@ -303,8 +303,8 @@ public class GroupCommandModule implements CommandModule { return "group"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_GROUP; + public String getDescriptionKey() { + return "command-description-group"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/HelpCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/HelpCommandModule.java index 483cb78..135be59 100644 --- a/src/main/java/dev/esophose/playerparticles/command/HelpCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/HelpCommandModule.java @@ -3,15 +3,18 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.manager.CommandManager; +import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; import dev.esophose.playerparticles.particles.PPlayer; public class HelpCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTIONS); - List cmds = ParticleCommandHandler.getCommands(); + List cmds = PlayerParticles.getInstance().getManager(CommandManager.class).getCommands(); for (CommandModule cmd : cmds) if (!(cmd instanceof DefaultCommandModule)) CommandModule.printUsageWithDescription(pplayer, cmd); @@ -26,8 +29,8 @@ public class HelpCommandModule implements CommandModule { return "help"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_HELP; + public String getDescriptionKey() { + return "command-description-help"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/ListCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/ListCommandModule.java index e339866..48f372a 100644 --- a/src/main/java/dev/esophose/playerparticles/command/ListCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/ListCommandModule.java @@ -38,8 +38,8 @@ public class ListCommandModule implements CommandModule { return "list"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_LIST; + public String getDescriptionKey() { + return "command-description-list"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/OtherCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/OtherCommandModule.java index 6db1829..f4506b9 100644 --- a/src/main/java/dev/esophose/playerparticles/command/OtherCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/OtherCommandModule.java @@ -1,25 +1,28 @@ package dev.esophose.playerparticles.command; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.util.StringUtil; - +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.CommandManager; import dev.esophose.playerparticles.manager.DataManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.OtherPPlayer; import dev.esophose.playerparticles.particles.PPlayer; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class OtherCommandModule implements CommandModuleSecondary { public void onCommandExecute(CommandSender sender, String[] args) { - if (!PermissionManager.canOverride(sender)) { + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + + if (!permissionManager.canOverride(sender)) { LangManager.sendCommandSenderMessage(sender, Lang.OTHER_NO_PERMISSION); return; } @@ -35,19 +38,19 @@ public class OtherCommandModule implements CommandModuleSecondary { return; } - CommandModule commandModule = ParticleCommandHandler.findMatchingCommand(args[1]); + CommandModule commandModule = PlayerParticles.getInstance().getManager(CommandManager.class).findMatchingCommand(args[1]); if (commandModule == null) { LangManager.sendCommandSenderMessage(sender, Lang.OTHER_UNKNOWN_COMMAND, args[1]); return; } - if (commandModule.requiresEffects() && PermissionManager.getEffectNamesUserHasPermissionFor(other).isEmpty()) { + if (commandModule.requiresEffects() && permissionManager.getEffectNamesUserHasPermissionFor(other).isEmpty()) { LangManager.sendCommandSenderMessage(sender, Lang.OTHER_SUCCESS, other.getName()); LangManager.sendCommandSenderMessage(sender, Lang.COMMAND_ERROR_NO_EFFECTS); return; } - DataManager.getPPlayer(other.getUniqueId(), (pplayer) -> { + PlayerParticles.getInstance().getManager(DataManager.class).getPPlayer(other.getUniqueId(), (pplayer) -> { OtherPPlayer otherPPlayer = new OtherPPlayer(sender, pplayer); LangManager.sendCommandSenderMessage(sender, Lang.OTHER_SUCCESS, other.getName()); @@ -68,14 +71,14 @@ public class OtherCommandModule implements CommandModuleSecondary { if (args.length == 0) completions = playerNames; else StringUtil.copyPartialMatches(args[0], playerNames, completions); } else if (args.length == 2) { - List commandNames = ParticleCommandHandler.getCommandNames(); + List commandNames = PlayerParticles.getInstance().getManager(CommandManager.class).getCommandNames(); StringUtil.copyPartialMatches(args[1], commandNames, completions); } else { Player otherPlayer = Bukkit.getPlayer(args[0]); if (otherPlayer != null) { - PPlayer other = DataManager.getPPlayer(otherPlayer.getUniqueId()); + PPlayer other = PlayerParticles.getInstance().getManager(DataManager.class).getPPlayer(otherPlayer.getUniqueId()); if (other != null) { - CommandModule commandModule = ParticleCommandHandler.findMatchingCommand(args[1]); + CommandModule commandModule = PlayerParticles.getInstance().getManager(CommandManager.class).findMatchingCommand(args[1]); if (commandModule != null) { String[] cmdArgs = Arrays.copyOfRange(args, 2, args.length); completions = commandModule.onTabComplete(other, cmdArgs); diff --git a/src/main/java/dev/esophose/playerparticles/command/ParticleCommandHandler.java b/src/main/java/dev/esophose/playerparticles/command/ParticleCommandHandler.java deleted file mode 100644 index 9dda352..0000000 --- a/src/main/java/dev/esophose/playerparticles/command/ParticleCommandHandler.java +++ /dev/null @@ -1,168 +0,0 @@ -package dev.esophose.playerparticles.command; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import dev.esophose.playerparticles.particles.OtherPPlayer; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; - -import dev.esophose.playerparticles.manager.DataManager; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -import dev.esophose.playerparticles.manager.PermissionManager; -import dev.esophose.playerparticles.particles.PPlayer; - -import net.md_5.bungee.api.ChatColor; - -public class ParticleCommandHandler implements CommandExecutor, TabCompleter { - - /** - * A list of all commands - */ - private static List commands; - private static CommandModuleSecondary ppoCommand; - - static { - commands = new ArrayList<>(); - - commands.add(new AddCommandModule()); - commands.add(new DataCommandModule()); - commands.add(new DefaultCommandModule()); - commands.add(new EditCommandModule()); - commands.add(new EffectsCommandModule()); - commands.add(new FixedCommandModule()); - commands.add(new GroupCommandModule()); - commands.add(new GUICommandModule()); - commands.add(new HelpCommandModule()); - commands.add(new ListCommandModule()); - commands.add(new ReloadCommandModule()); - commands.add(new RemoveCommandModule()); - commands.add(new ResetCommandModule()); - commands.add(new StylesCommandModule()); - commands.add(new ToggleCommandModule()); - commands.add(new VersionCommandModule()); - commands.add(new WorldsCommandModule()); - - ppoCommand = new OtherCommandModule(); - } - - /** - * Finds a matching CommandModule by its name - * - * @param commandName The command name - * @return The found CommandModule, otherwise null - */ - public static CommandModule findMatchingCommand(String commandName) { - for (CommandModule commandModule : commands) - if (commandModule.getName().equalsIgnoreCase(commandName)) - return commandModule; - return null; - } - - /** - * Get a list of all available commands - * - * @return A List of all CommandModules registered - */ - public static List getCommands() { - return commands; - } - - /** - * Get all available command names - * - * @return All available command names - */ - public static List getCommandNames() { - List commandNames = new ArrayList<>(); - for (CommandModule cmd : commands) - commandNames.add(cmd.getName()); - return commandNames; - } - - /** - * Called when a player executes a PlayerParticles command - * Checks what PlayerParticles command it is and calls the corresponding module - * - * @param sender Who executed the command - * @param cmd The command - * @param label The command label - * @param args The arguments following the command - * @return true - */ - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - if (cmd.getName().equalsIgnoreCase("pp")) { - String commandName = args.length > 0 ? args[0] : ""; - CommandModule commandModule = findMatchingCommand(commandName); - if (commandModule == null) { - sender.sendMessage(LangManager.getText(Lang.COMMAND_ERROR_UNKNOWN)); - return true; - } - - String[] cmdArgs = args.length > 1 ? Arrays.copyOfRange(args, 1, args.length) : new String[0]; - - if (!commandModule.canConsoleExecute()) { - if (!(sender instanceof Player)) { - sender.sendMessage(ChatColor.RED + "Error: This command can only be executed by a player."); - return true; - } - } else { - commandModule.onCommandExecute(new OtherPPlayer(sender), cmdArgs); - return true; - } - - Player p = (Player) sender; - - DataManager.getPPlayer(p.getUniqueId(), (pplayer) -> { - if (commandModule.requiresEffects() && PermissionManager.getEffectNamesUserHasPermissionFor(p).isEmpty()) { - LangManager.sendMessage(pplayer, Lang.COMMAND_ERROR_NO_EFFECTS); - } else { - commandModule.onCommandExecute(pplayer, cmdArgs); - } - }); - } else if (cmd.getName().equalsIgnoreCase("ppo")) { - ppoCommand.onCommandExecute(sender, args); - } - - return true; - } - - /** - * Activated when a user pushes tab in chat prefixed with /pp - * - * @param sender The sender that hit tab, should always be a player - * @param cmd The command the player is executing - * @param alias The possible alias for the command - * @param args All arguments following the command - * @return A list of commands available to the sender - */ - public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { - if (cmd.getName().equalsIgnoreCase("pp")) { - if (!(sender instanceof Player)) return new ArrayList<>(); - - PPlayer pplayer = DataManager.getPPlayer(((Player) sender).getUniqueId()); - if (pplayer == null) return new ArrayList<>(); - - if (args.length <= 1) { - CommandModule commandModule = findMatchingCommand(""); // Get the default command module - return commandModule.onTabComplete(pplayer, args); - } else { - CommandModule commandModule = findMatchingCommand(args[0]); - if (commandModule != null) { - String[] cmdArgs = Arrays.copyOfRange(args, 1, args.length); - return commandModule.onTabComplete(pplayer, cmdArgs); - } - } - } else if (cmd.getName().equalsIgnoreCase("ppo")) { - return ppoCommand.onTabComplete(sender, args); - } - - return new ArrayList<>(); - } - -} diff --git a/src/main/java/dev/esophose/playerparticles/command/ReloadCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/ReloadCommandModule.java index 7a11e35..5169650 100644 --- a/src/main/java/dev/esophose/playerparticles/command/ReloadCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/ReloadCommandModule.java @@ -12,10 +12,10 @@ import dev.esophose.playerparticles.particles.PPlayer; public class ReloadCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { - if (PermissionManager.canReloadPlugin(pplayer.getMessageDestination())) { - PlayerParticles.getPlugin().reload(false); + if (PlayerParticles.getInstance().getManager(PermissionManager.class).canReloadPlugin(pplayer.getMessageDestination())) { + PlayerParticles.getInstance().reload(); LangManager.sendMessage(pplayer, Lang.RELOAD_SUCCESS); - PlayerParticles.getPlugin().getLogger().info("Reloaded configuration."); + PlayerParticles.getInstance().getLogger().info("Reloaded configuration."); } else { LangManager.sendMessage(pplayer, Lang.RELOAD_NO_PERMISSION); } @@ -29,8 +29,8 @@ public class ReloadCommandModule implements CommandModule { return "reload"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_RELOAD; + public String getDescriptionKey() { + return "command-description-reload"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/RemoveCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/RemoveCommandModule.java index 1b1d938..d9992f0 100644 --- a/src/main/java/dev/esophose/playerparticles/command/RemoveCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/RemoveCommandModule.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.styles.api.ParticleStyle; import org.apache.commons.lang.StringUtils; import org.bukkit.util.StringUtil; @@ -20,6 +21,8 @@ import dev.esophose.playerparticles.particles.ParticlePair; public class RemoveCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + if (args.length == 0) { LangManager.sendMessage(pplayer, Lang.REMOVE_NO_ARGS); return; @@ -54,7 +57,7 @@ public class RemoveCommandModule implements CommandModule { return; } - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); LangManager.sendMessage(pplayer, Lang.REMOVE_ID_SUCCESS, id); } else { // Removing by effect/style name ParticleEffect effect = ParticleEffect.fromName(args[0]); @@ -71,7 +74,7 @@ public class RemoveCommandModule implements CommandModule { } if (removedCount > 0) { - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); LangManager.sendMessage(pplayer, Lang.REMOVE_EFFECT_SUCCESS, removedCount, effect.getName()); } else { LangManager.sendMessage(pplayer, Lang.REMOVE_EFFECT_NONE, effect.getName()); @@ -87,7 +90,7 @@ public class RemoveCommandModule implements CommandModule { } if (removedCount > 0) { - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); LangManager.sendMessage(pplayer, Lang.REMOVE_STYLE_SUCCESS, removedCount, style.getName()); } else { LangManager.sendMessage(pplayer, Lang.REMOVE_STYLE_NONE, style.getName()); @@ -118,8 +121,8 @@ public class RemoveCommandModule implements CommandModule { return "remove"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_REMOVE; + public String getDescriptionKey() { + return "command-description-remove"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/ResetCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/ResetCommandModule.java index ce67131..bfa8cf2 100644 --- a/src/main/java/dev/esophose/playerparticles/command/ResetCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/ResetCommandModule.java @@ -3,6 +3,7 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.DataManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; @@ -13,7 +14,7 @@ public class ResetCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { int particleCount = pplayer.getActiveParticles().size(); - DataManager.saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup()); + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup()); LangManager.sendMessage(pplayer, Lang.RESET_SUCCESS, particleCount); } @@ -25,8 +26,8 @@ public class ResetCommandModule implements CommandModule { return "reset"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_RESET; + public String getDescriptionKey() { + return "command-description-reset"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/StylesCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/StylesCommandModule.java index 897c9b0..a060fca 100644 --- a/src/main/java/dev/esophose/playerparticles/command/StylesCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/StylesCommandModule.java @@ -3,6 +3,7 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import org.bukkit.entity.Player; import dev.esophose.playerparticles.manager.LangManager; @@ -15,7 +16,7 @@ public class StylesCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { Player p = pplayer.getPlayer(); - List styleNames = PermissionManager.getStyleNamesUserHasPermissionFor(p); + List styleNames = PlayerParticles.getInstance().getManager(PermissionManager.class).getStyleNamesUserHasPermissionFor(p); StringBuilder toSend = new StringBuilder(); for (String name : styleNames) { toSend.append(name).append(", "); @@ -36,8 +37,8 @@ public class StylesCommandModule implements CommandModule { return "styles"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_STYLES; + public String getDescriptionKey() { + return "command-description-styles"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/ToggleCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/ToggleCommandModule.java index 7f58b0d..cb73c22 100644 --- a/src/main/java/dev/esophose/playerparticles/command/ToggleCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/ToggleCommandModule.java @@ -3,6 +3,7 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.DataManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; @@ -12,7 +13,7 @@ public class ToggleCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { boolean canSee = pplayer.canSeeParticles(); - DataManager.updateSettingParticlesHidden(pplayer.getUniqueId(), canSee); + PlayerParticles.getInstance().getManager(DataManager.class).updateSettingParticlesHidden(pplayer.getUniqueId(), canSee); if (canSee) { LangManager.sendMessage(pplayer, Lang.TOGGLE_OFF); @@ -29,8 +30,8 @@ public class ToggleCommandModule implements CommandModule { return "toggle"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_TOGGLE; + public String getDescriptionKey() { + return "command-description-toggle"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/VersionCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/VersionCommandModule.java index 7b92e5a..4326110 100644 --- a/src/main/java/dev/esophose/playerparticles/command/VersionCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/VersionCommandModule.java @@ -13,7 +13,7 @@ import dev.esophose.playerparticles.particles.PPlayer; public class VersionCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { - LangManager.sendCustomMessage(pplayer, ChatColor.YELLOW + "Running PlayerParticles " + ChatColor.AQUA + "v" + PlayerParticles.getPlugin().getDescription().getVersion()); + LangManager.sendCustomMessage(pplayer, ChatColor.YELLOW + "Running PlayerParticles " + ChatColor.AQUA + "v" + PlayerParticles.getInstance().getDescription().getVersion()); LangManager.sendCustomMessage(pplayer, ChatColor.YELLOW + "Plugin created by: " + ChatColor.AQUA + "Esophose"); } @@ -25,8 +25,8 @@ public class VersionCommandModule implements CommandModule { return "version"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_VERSION; + public String getDescriptionKey() { + return "command-description-version"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/command/WorldsCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/WorldsCommandModule.java index eec1824..311997b 100644 --- a/src/main/java/dev/esophose/playerparticles/command/WorldsCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/WorldsCommandModule.java @@ -3,6 +3,7 @@ package dev.esophose.playerparticles.command; import java.util.ArrayList; import java.util.List; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.PermissionManager; @@ -11,13 +12,14 @@ import dev.esophose.playerparticles.particles.PPlayer; public class WorldsCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { - if (PermissionManager.getDisabledWorlds() == null || PermissionManager.getDisabledWorlds().isEmpty()) { + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + if (permissionManager.getDisabledWorlds() == null || permissionManager.getDisabledWorlds().isEmpty()) { LangManager.sendMessage(pplayer, Lang.DISABLED_WORLDS_NONE); return; } StringBuilder worlds = new StringBuilder(); - for (String s : PermissionManager.getDisabledWorlds()) { + for (String s : permissionManager.getDisabledWorlds()) { worlds.append(s).append(", "); } if (worlds.length() > 2) worlds = new StringBuilder(worlds.substring(0, worlds.length() - 2)); @@ -33,8 +35,8 @@ public class WorldsCommandModule implements CommandModule { return "worlds"; } - public Lang getDescription() { - return Lang.COMMAND_DESCRIPTION_WORLDS; + public String getDescriptionKey() { + return "command-description-worlds"; } public String getArguments() { diff --git a/src/main/java/dev/esophose/playerparticles/config/CommentedConfigurationSection.java b/src/main/java/dev/esophose/playerparticles/config/CommentedConfigurationSection.java new file mode 100644 index 0000000..8c69c41 --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/config/CommentedConfigurationSection.java @@ -0,0 +1,378 @@ +package dev.esophose.playerparticles.config; + +import org.bukkit.Color; +import org.bukkit.OfflinePlayer; +import org.bukkit.configuration.Configuration; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class CommentedConfigurationSection implements ConfigurationSection { + + protected ConfigurationSection config; + + public CommentedConfigurationSection(ConfigurationSection configuration) { + this.config = configuration; + } + + /** + * Gets a defaulted boolean value. These accept values of either "default", true, or false + * + * @param path The value key + * @return null for "default", otherwise true or false + */ + public Boolean getDefaultedBoolean(String path) { + if (this.isBoolean(path)) { + return this.getBoolean(path); + } else if (this.isString(path)) { + String stringValue = this.getString(path); + if (stringValue != null && stringValue.equalsIgnoreCase("default")) + return null; + } + + return null; + } + + /** + * Gets a defaulted boolean value. These accept values of either "default", true, or false + * + * @param path The value key + * @param def The value to return if the key is not found + * @return null for "default", otherwise true or false + */ + public Boolean getDefaultedBoolean(String path, Boolean def) { + Object value = this.get(path); + if (value instanceof Boolean) { + return (Boolean) value; + } else if (value instanceof String) { + String stringValue = (String) value; + if (stringValue.equalsIgnoreCase("default")) + return null; + } + + if (value == null) + return def; + + return null; + } + + @Override + public Set getKeys(boolean b) { + return this.config.getKeys(b); + } + + @Override + public Map getValues(boolean b) { + return this.config.getValues(b); + } + + @Override + public boolean contains(String s) { + return this.config.contains(s); + } + + @Override + public boolean contains(String s, boolean b) { + return this.config.contains(s, b); + } + + @Override + public boolean isSet(String s) { + return this.config.isSet(s); + } + + @Override + public String getCurrentPath() { + return this.config.getCurrentPath(); + } + + @Override + public String getName() { + return this.config.getName(); + } + + @Override + public Configuration getRoot() { + return this.config.getRoot(); + } + + @Override + public ConfigurationSection getParent() { + return this.config.getParent(); + } + + @Override + public Object get(String s) { + return this.config.get(s); + } + + @Override + public Object get(String s, Object o) { + return this.config.get(s, o); + } + + @Override + public void set(String s, Object o) { + this.config.set(s, o); + } + + @Override + public CommentedConfigurationSection createSection(String s) { + return new CommentedConfigurationSection(this.config.createSection(s)); + } + + @Override + public CommentedConfigurationSection createSection(String s, Map map) { + return new CommentedConfigurationSection(this.config.createSection(s, map)); + } + + @Override + public String getString(String s) { + return this.config.getString(s); + } + + @Override + public String getString(String s, String s1) { + return this.config.getString(s, s1); + } + + @Override + public boolean isString(String s) { + return this.config.isString(s); + } + + @Override + public int getInt(String s) { + return this.config.getInt(s); + } + + @Override + public int getInt(String s, int i) { + return this.config.getInt(s, i); + } + + @Override + public boolean isInt(String s) { + return this.config.isInt(s); + } + + @Override + public boolean getBoolean(String s) { + return this.config.getBoolean(s); + } + + @Override + public boolean getBoolean(String s, boolean b) { + return this.config.getBoolean(s, b); + } + + @Override + public boolean isBoolean(String s) { + return this.config.isBoolean(s); + } + + @Override + public double getDouble(String s) { + return this.config.getDouble(s); + } + + @Override + public double getDouble(String s, double v) { + return this.config.getDouble(s, v); + } + + @Override + public boolean isDouble(String s) { + return this.config.isDouble(s); + } + + @Override + public long getLong(String s) { + return this.config.getLong(s); + } + + @Override + public long getLong(String s, long l) { + return this.config.getLong(s, l); + } + + @Override + public boolean isLong(String s) { + return this.config.isLong(s); + } + + @Override + public List getList(String s) { + return this.config.getList(s); + } + + @Override + public List getList(String s, List list) { + return this.config.getList(s, list); + } + + @Override + public boolean isList(String s) { + return this.config.isList(s); + } + + @Override + public List getStringList(String s) { + return this.config.getStringList(s); + } + + @Override + public List getIntegerList(String s) { + return this.config.getIntegerList(s); + } + + @Override + public List getBooleanList(String s) { + return this.config.getBooleanList(s); + } + + @Override + public List getDoubleList(String s) { + return this.config.getDoubleList(s); + } + + @Override + public List getFloatList(String s) { + return this.config.getFloatList(s); + } + + @Override + public List getLongList(String s) { + return this.config.getLongList(s); + } + + @Override + public List getByteList(String s) { + return this.config.getByteList(s); + } + + @Override + public List getCharacterList(String s) { + return this.config.getCharacterList(s); + } + + @Override + public List getShortList(String s) { + return this.config.getShortList(s); + } + + @Override + public List> getMapList(String s) { + return this.config.getMapList(s); + } + + @Override + public T getObject(String s, Class aClass) { + return this.config.getObject(s, aClass); + } + + @Override + public T getObject(String s, Class aClass, T t) { + return this.config.getObject(s, aClass, t); + } + + @Override + public T getSerializable(String s, Class aClass) { + return this.config.getSerializable(s, aClass); + } + + @Override + public T getSerializable(String s, Class aClass, T t) { + return this.config.getSerializable(s, aClass, t); + } + + @Override + public Vector getVector(String s) { + return this.config.getVector(s); + } + + @Override + public Vector getVector(String s, Vector vector) { + return this.config.getVector(s, vector); + } + + @Override + public boolean isVector(String s) { + return this.config.isVector(s); + } + + @Override + public OfflinePlayer getOfflinePlayer(String s) { + return this.config.getOfflinePlayer(s); + } + + @Override + public OfflinePlayer getOfflinePlayer(String s, OfflinePlayer offlinePlayer) { + return this.config.getOfflinePlayer(s, offlinePlayer); + } + + @Override + public boolean isOfflinePlayer(String s) { + return this.config.isOfflinePlayer(s); + } + + @Override + public ItemStack getItemStack(String s) { + return this.config.getItemStack(s); + } + + @Override + public ItemStack getItemStack(String s, ItemStack itemStack) { + return this.config.getItemStack(s, itemStack); + } + + @Override + public boolean isItemStack(String s) { + return this.config.isItemStack(s); + } + + @Override + public Color getColor(String s) { + return this.config.getColor(s); + } + + @Override + public Color getColor(String s, Color color) { + return this.config.getColor(s, color); + } + + @Override + public boolean isColor(String s) { + return this.config.isColor(s); + } + + @Override + public CommentedConfigurationSection getConfigurationSection(String s) { + ConfigurationSection section = this.config.getConfigurationSection(s); + if (section == null) + return this.createSection(s); + + return new CommentedConfigurationSection(section); + } + + @Override + public boolean isConfigurationSection(String s) { + return this.config.isConfigurationSection(s); + } + + @Override + public CommentedConfigurationSection getDefaultSection() { + return new CommentedConfigurationSection(this.config.getDefaultSection()); + } + + @Override + public void addDefault(String s, Object o) { + this.config.addDefault(s, o); + } + +} diff --git a/src/main/java/dev/esophose/playerparticles/config/CommentedFileConfiguration.java b/src/main/java/dev/esophose/playerparticles/config/CommentedFileConfiguration.java new file mode 100644 index 0000000..18fe25a --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/config/CommentedFileConfiguration.java @@ -0,0 +1,91 @@ +package dev.esophose.playerparticles.config; + +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.java.JavaPlugin; +import org.yaml.snakeyaml.DumperOptions; + +import java.io.File; +import java.io.Reader; +import java.lang.reflect.Field; + +public class CommentedFileConfiguration extends CommentedConfigurationSection { + + private int comments; + private CommentedFileConfigurationHelper helper; + private File file; + + public CommentedFileConfiguration(Reader configStream, File configFile, int comments, JavaPlugin plugin) { + super(YamlConfiguration.loadConfiguration(configStream)); + this.comments = comments; + this.helper = new CommentedFileConfigurationHelper(plugin); + this.file = configFile; + } + + public static CommentedFileConfiguration loadConfiguration(JavaPlugin plugin, File file) { + return new CommentedFileConfigurationHelper(plugin).getNewConfig(file); + } + + public void set(String path, Object value, String... comments) { + if (!this.contains(path)) { + int subpathIndex = path.lastIndexOf('.'); + String subpath = subpathIndex == -1 ? "" : path.substring(0, subpathIndex) + '.'; + + for (String comment : comments) { + this.set(subpath + this.helper.getPluginName() + "_COMMENT_" + this.comments, " " + comment); + this.comments++; + } + } + + this.set(path, value); + } + + public void addComments(String... comments) { + for (String comment : comments) { + this.set(this.helper.getPluginName() + "_COMMENT_" + this.comments, " " + comment); + this.comments++; + } + } + + public void reloadConfig() { + this.config = YamlConfiguration.loadConfiguration(this.helper.getConfigContent(this.file)); + } + + public void save() { + this.save(false); + } + + public void save(boolean compactLines) { + String config = this.getConfigAsString(); + this.helper.saveConfig(config, this.file, compactLines); + } + + public void save(File file) { + this.save(file, false); + } + + public void save(File file, boolean compactLines) { + String config = this.getConfigAsString(); + this.helper.saveConfig(config, file, compactLines); + } + + private String getConfigAsString() { + if (!(this.config instanceof YamlConfiguration)) + throw new UnsupportedOperationException("Cannot get config string of non-YamlConfiguration"); + + YamlConfiguration yamlConfiguration = (YamlConfiguration) this.config; + + // Edit the configuration to how we want it + try { + Field field_yamlOptions = YamlConfiguration.class.getDeclaredField("yamlOptions"); + field_yamlOptions.setAccessible(true); + DumperOptions yamlOptions = (DumperOptions) field_yamlOptions.get(yamlConfiguration); + yamlOptions.setWidth(Integer.MAX_VALUE); + yamlOptions.setIndicatorIndent(2); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + + return yamlConfiguration.saveToString(); + } + +} diff --git a/src/main/java/dev/esophose/playerparticles/config/CommentedFileConfigurationHelper.java b/src/main/java/dev/esophose/playerparticles/config/CommentedFileConfigurationHelper.java new file mode 100644 index 0000000..8035651 --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/config/CommentedFileConfigurationHelper.java @@ -0,0 +1,223 @@ +package dev.esophose.playerparticles.config; + +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CommentedFileConfigurationHelper { + + private JavaPlugin plugin; + + /** + * Manage custom configurations and files + */ + public CommentedFileConfigurationHelper(JavaPlugin plugin) { + this.plugin = plugin; + } + + /** + * Get new configuration + * + * @param file - Path to file + * @return - New SimpleConfig + */ + public CommentedFileConfiguration getNewConfig(File file) { + if (!this.plugin.getDataFolder().exists()) + this.plugin.getDataFolder().mkdir(); + + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return new CommentedFileConfiguration(this.getConfigContent(file), file, this.getCommentsNum(file), this.plugin); + } + + /** + * Read file and make comments SnakeYAML friendly + * + * @param file - Path to file + * @return - File as Input Stream + */ + public Reader getConfigContent(File file) { + if (!file.exists()) + return new InputStreamReader(new ByteArrayInputStream(new byte[0])); + + try { + int commentNum = 0; + + String pluginName = this.getPluginName(); + + StringBuilder whole = new StringBuilder(); + BufferedReader reader = new BufferedReader(new FileReader(file)); + + String currentLine; + while ((currentLine = reader.readLine()) != null) { + // Convert comments into keys + if (currentLine.trim().startsWith("#")) { + String addLine = currentLine.replaceAll(Pattern.quote("'"), Matcher.quoteReplacement("''")) + .replaceFirst("#", pluginName + "_COMMENT_" + commentNum++ + ": '") + "'"; + whole.append(addLine).append("\n"); + } else { + whole.append(currentLine).append("\n"); + } + } + + String config = whole.toString(); + Reader configStream = new InputStreamReader(new ByteArrayInputStream(config.getBytes(StandardCharsets.UTF_8))); + + reader.close(); + return configStream; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + /** + * Get comments from file + * + * @param file - File + * @return - Comments number + */ + private int getCommentsNum(File file) { + if (!file.exists()) + return 0; + + try { + int comments = 0; + String currentLine; + + BufferedReader reader = new BufferedReader(new FileReader(file)); + + while ((currentLine = reader.readLine()) != null) + if (currentLine.trim().startsWith("#")) + comments++; + + reader.close(); + return comments; + } catch (IOException e) { + e.printStackTrace(); + return 0; + } + } + + private String prepareConfigString(String configString) { + boolean lastLine = false; + + String[] lines = configString.split("\n"); + StringBuilder config = new StringBuilder(); + + for (String line : lines) { + if (line.trim().startsWith(this.getPluginName() + "_COMMENT")) { + int whitespaceIndex = line.indexOf(line.trim()); + String comment = line.substring(0, whitespaceIndex) + "#" + line.substring(line.indexOf(":") + 3, line.length() - 1); + + String normalComment; + if (comment.trim().startsWith("#'")) { + normalComment = comment.substring(0, comment.length() - 1).replaceFirst("#'", "# "); + } else { + normalComment = comment; + } + + normalComment = normalComment.replaceAll("''", "'"); + + if (!lastLine) { + config.append(normalComment).append("\n"); + } else { + config.append("\n").append(normalComment).append("\n"); + } + + lastLine = false; + } else { + config.append(line).append("\n"); + lastLine = true; + } + } + + return config.toString(); + } + + /** + * Saves configuration to file + * + * @param configString - Config string + * @param file - Config file + * @param compactLines - If lines should forcefully be separated by only one newline character + */ + public void saveConfig(String configString, File file, boolean compactLines) { + String configuration = this.prepareConfigString(configString).replaceAll("\n\n", "\n"); + + // Apply post-processing to config string to make it pretty + StringBuilder stringBuilder = new StringBuilder(); + try (Scanner scanner = new Scanner(configuration)) { + boolean lastLineHadContent = false; + int lastCommentSpacing = -1; + int lastLineSpacing = -1; + boolean forceCompact = false; + + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + + boolean lineHadContent = false; + boolean lineWasComment = false; + int commentSpacing = -1; + int lineSpacing = line.indexOf(line.trim()); + + if (line.trim().startsWith("#")) { + lineWasComment = true; + String trimmed = line.trim().replaceFirst("#", ""); + commentSpacing = trimmed.indexOf(trimmed.trim()); + } else if (!line.trim().isEmpty()) { + lineHadContent = true; + + if (line.trim().startsWith("-")) + forceCompact = true; + } + + if (!compactLines && !forceCompact && ((lastLineSpacing != -1 && lineSpacing != lastLineSpacing) + || (commentSpacing != -1 && commentSpacing < lastCommentSpacing) + || (lastLineHadContent && lineHadContent) + || (lineWasComment && lastLineHadContent))) { + stringBuilder.append('\n'); + } + + stringBuilder.append(line).append('\n'); + + lastLineHadContent = lineHadContent; + lastCommentSpacing = commentSpacing; + lastLineSpacing = lineSpacing; + forceCompact = false; + } + } + + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write(stringBuilder.toString()); + writer.flush(); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public String getPluginName() { + return this.plugin.getDescription().getName(); + } + +} diff --git a/src/main/java/dev/esophose/playerparticles/database/DataMigration.java b/src/main/java/dev/esophose/playerparticles/database/DataMigration.java new file mode 100644 index 0000000..24f95dd --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/database/DataMigration.java @@ -0,0 +1,31 @@ +package dev.esophose.playerparticles.database; + +import java.sql.Connection; +import java.sql.SQLException; + +public abstract class DataMigration { + + private final int revision; + + public DataMigration(int revision) { + this.revision = revision; + } + + /** + * Migrates the database to this migration stage + * + * @param connector The connector for the database + * @param connection The connection to the database + * @param tablePrefix The prefix of the database + * @throws SQLException Any error that occurs during the SQL execution + */ + public abstract void migrate(DatabaseConnector connector, Connection connection, String tablePrefix) throws SQLException; + + /** + * @return the revision number of this migration + */ + public int getRevision() { + return this.revision; + } + +} diff --git a/src/main/java/dev/esophose/playerparticles/database/DatabaseConnector.java b/src/main/java/dev/esophose/playerparticles/database/DatabaseConnector.java index 5ab1013..b94fa03 100644 --- a/src/main/java/dev/esophose/playerparticles/database/DatabaseConnector.java +++ b/src/main/java/dev/esophose/playerparticles/database/DatabaseConnector.java @@ -7,8 +7,8 @@ public interface DatabaseConnector { /** * Checks if the connection to the database has been created - * - * @return If the connection is created or not + * + * @return true if the connection is created, otherwise false */ boolean isInitialized(); @@ -19,16 +19,16 @@ public interface DatabaseConnector { /** * Executes a callback with a Connection passed and automatically closes it when finished - * + * * @param callback The callback to execute once the connection is retrieved */ void connect(ConnectionCallback callback); /** - * Allows Lambda expressions to be used to reduce duplicated code for getting connections + * Wraps a connection in a callback which will automagically handle catching sql errors */ interface ConnectionCallback { - void execute(Connection connection) throws SQLException; + void accept(Connection connection) throws SQLException; } } diff --git a/src/main/java/dev/esophose/playerparticles/database/MySqlDatabaseConnector.java b/src/main/java/dev/esophose/playerparticles/database/MySQLConnector.java similarity index 52% rename from src/main/java/dev/esophose/playerparticles/database/MySqlDatabaseConnector.java rename to src/main/java/dev/esophose/playerparticles/database/MySQLConnector.java index b353656..6288ba0 100644 --- a/src/main/java/dev/esophose/playerparticles/database/MySqlDatabaseConnector.java +++ b/src/main/java/dev/esophose/playerparticles/database/MySQLConnector.java @@ -1,31 +1,26 @@ package dev.esophose.playerparticles.database; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.bukkit.plugin.Plugin; + import java.sql.Connection; import java.sql.SQLException; -import dev.esophose.playerparticles.PlayerParticles; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; - -public class MySqlDatabaseConnector implements DatabaseConnector { +public class MySQLConnector implements DatabaseConnector { + private final Plugin plugin; private HikariDataSource hikari; private boolean initializedSuccessfully; - public MySqlDatabaseConnector() { - String hostname = PSetting.DATABASE_HOSTNAME.getString(); - String port = PSetting.DATABASE_PORT.getString(); - String database = PSetting.DATABASE_NAME.getString(); - String user = PSetting.DATABASE_USER_NAME.getString(); - String pass = PSetting.DATABASE_USER_PASSWORD.getString(); - boolean useSSL = PSetting.DATABASE_USE_SSL.getBoolean(); + public MySQLConnector(Plugin plugin, String hostname, int port, String database, String username, String password, boolean useSSL) { + this.plugin = plugin; HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://" + hostname + ":" + port + "/" + database + "?useSSL=" + useSSL); - config.setUsername(user); - config.setPassword(pass); - config.setMaximumPoolSize(3); + config.setUsername(username); + config.setPassword(password); + config.setMaximumPoolSize(5); try { this.hikari = new HikariDataSource(config); @@ -45,9 +40,10 @@ public class MySqlDatabaseConnector implements DatabaseConnector { public void connect(ConnectionCallback callback) { try (Connection connection = this.hikari.getConnection()) { - callback.execute(connection); + callback.accept(connection); } catch (SQLException ex) { - PlayerParticles.getPlugin().getLogger().severe("An error occurred retrieving a MySQL database connection: " + ex.getMessage()); + this.plugin.getLogger().severe("An error occurred executing a MySQL query: " + ex.getMessage()); + ex.printStackTrace(); } } diff --git a/src/main/java/dev/esophose/playerparticles/database/SQLiteConnector.java b/src/main/java/dev/esophose/playerparticles/database/SQLiteConnector.java new file mode 100644 index 0000000..c773d88 --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/database/SQLiteConnector.java @@ -0,0 +1,59 @@ +package dev.esophose.playerparticles.database; + +import org.bukkit.plugin.Plugin; + +import java.io.File; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class SQLiteConnector implements DatabaseConnector { + + private final Plugin plugin; + private final String connectionString; + private Connection connection; + + public SQLiteConnector(Plugin plugin) { + this.plugin = plugin; + this.connectionString = "jdbc:sqlite:" + plugin.getDataFolder() + File.separator + plugin.getDescription().getName().toLowerCase() + ".db"; + + try { + Class.forName("org.sqlite.JDBC"); // This is required to put here for Spigot 1.10 and below for some reason + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + public boolean isInitialized() { + return true; // Always available + } + + public void closeConnection() { + try { + if (this.connection != null) { + this.connection.close(); + } + } catch (SQLException ex) { + this.plugin.getLogger().severe("An error occurred closing the SQLite database connection: " + ex.getMessage()); + } + } + + public void connect(ConnectionCallback callback) { + if (this.connection == null) { + try { + this.connection = DriverManager.getConnection(this.connectionString); + } catch (SQLException ex) { + this.plugin.getLogger().severe("An error occurred retrieving the SQLite database connection: " + ex.getMessage()); + } + } + + try { + callback.accept(this.connection); + } catch (Exception ex) { + this.plugin.getLogger().severe("An error occurred executing an SQLite query: " + ex.getMessage()); + ex.printStackTrace(); + } + } + +} + diff --git a/src/main/java/dev/esophose/playerparticles/database/SqliteDatabaseConnector.java b/src/main/java/dev/esophose/playerparticles/database/SqliteDatabaseConnector.java deleted file mode 100644 index d233b62..0000000 --- a/src/main/java/dev/esophose/playerparticles/database/SqliteDatabaseConnector.java +++ /dev/null @@ -1,49 +0,0 @@ -package dev.esophose.playerparticles.database; - -import java.io.File; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -import dev.esophose.playerparticles.PlayerParticles; - -public class SqliteDatabaseConnector implements DatabaseConnector { - - private final String connectionString; - private Connection connection; - - public SqliteDatabaseConnector(String directory) { - this.connectionString = "jdbc:sqlite:" + directory + File.separator + "playerparticles.db"; - } - - public boolean isInitialized() { - return true; // Always available - } - - public void closeConnection() { - try { - if (this.connection != null) { - this.connection.close(); - } - } catch (SQLException ex) { - PlayerParticles.getPlugin().getLogger().severe("An error occurred closing the SQLite database connection: " + ex.getMessage()); - } - } - - public void connect(ConnectionCallback callback) { - if (this.connection == null) { - try { - this.connection = DriverManager.getConnection(this.connectionString); - } catch (SQLException ex) { - PlayerParticles.getPlugin().getLogger().severe("An error occurred retrieving the SQLite database connection: " + ex.getMessage()); - } - } - - try { - callback.execute(this.connection); - } catch (SQLException ex) { - PlayerParticles.getPlugin().getLogger().severe("An error occurred retrieving the SQLite database connection: " + ex.getMessage()); - } - } - -} diff --git a/src/main/java/dev/esophose/playerparticles/database/migrations/_1_InitialMigration.java b/src/main/java/dev/esophose/playerparticles/database/migrations/_1_InitialMigration.java new file mode 100644 index 0000000..6a58a14 --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/database/migrations/_1_InitialMigration.java @@ -0,0 +1,91 @@ +package dev.esophose.playerparticles.database.migrations; + +import dev.esophose.playerparticles.database.DataMigration; +import dev.esophose.playerparticles.database.DatabaseConnector; +import dev.esophose.playerparticles.database.SQLiteConnector; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; + +public class _1_InitialMigration extends DataMigration { + + public _1_InitialMigration() { + super(1); + } + + @Override + public void migrate(DatabaseConnector connector, Connection connection, String tablePrefix) throws SQLException { + // Check if we are still running legacy data + boolean hasLegacy; + String legacyQuery; + if (connector instanceof SQLiteConnector) { + legacyQuery = "SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?"; + } else { + legacyQuery = "SHOW TABLES LIKE ?"; + } + + try (PreparedStatement statement = connection.prepareStatement(legacyQuery)) { + statement.setString(1, "pp_data_note"); + hasLegacy = statement.executeQuery().next(); + } + + if (hasLegacy) { + // Drop legacy tables + try (Statement statement = connection.createStatement()) { + statement.addBatch("DROP TABLE IF EXISTS pp_users"); + statement.addBatch("DROP TABLE IF EXISTS pp_fixed"); + statement.addBatch("DROP TABLE IF EXISTS pp_data_item"); + statement.addBatch("DROP TABLE IF EXISTS pp_data_block"); + statement.addBatch("DROP TABLE IF EXISTS pp_data_color"); + statement.addBatch("DROP TABLE IF EXISTS pp_data_note"); + statement.executeBatch(); + } + } + + // Check if we are still running legacy data + boolean hasTables; + String tablesQuery; + if (connector instanceof SQLiteConnector) { + tablesQuery = "SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?"; + } else { + tablesQuery = "SHOW TABLES LIKE ?"; + } + + try (PreparedStatement statement = connection.prepareStatement(tablesQuery)) { + statement.setString(1, "pp_settings"); + hasTables = statement.executeQuery().next(); + } + + // Rename the tables if they aleady exist + if (hasTables) { + try (Statement statement = connection.createStatement()) { + if (connector instanceof SQLiteConnector) { + statement.addBatch("ALTER TABLE pp_settings RENAME TO " + tablePrefix + "_settings"); + statement.addBatch("ALTER TABLE pp_particle RENAME TO " + tablePrefix + "_particle"); + statement.addBatch("ALTER TABLE pp_group RENAME TO " + tablePrefix + "_group"); + statement.addBatch("ALTER TABLE pp_fixed RENAME TO " + tablePrefix + "_fixed"); + } else { + statement.addBatch("RENAME TABLE pp_settings TO " + tablePrefix + "_settings"); + statement.addBatch("RENAME TABLE pp_particle TO " + tablePrefix + "_particle"); + statement.addBatch("RENAME TABLE pp_group TO " + tablePrefix + "_group"); + statement.addBatch("RENAME TABLE pp_fixed TO " + tablePrefix + "_fixed"); + } + + statement.executeBatch(); + } + } else { // Otherwise create them + try (Statement createStatement = connection.createStatement()) { + createStatement.addBatch("CREATE TABLE IF NOT EXISTS " + tablePrefix + "_settings (player_uuid VARCHAR(36), particles_hidden TINYINT)"); + createStatement.addBatch("CREATE TABLE IF NOT EXISTS " + tablePrefix + "_particle (uuid VARCHAR(36), group_uuid VARCHAR(36), id SMALLINT, effect VARCHAR(100), style VARCHAR(100), item_material VARCHAR(100), block_material VARCHAR(100), note SMALLINT, r SMALLINT, g SMALLINT, b SMALLINT, PRIMARY KEY(uuid))"); + createStatement.addBatch("CREATE TABLE IF NOT EXISTS " + tablePrefix + "_group (uuid VARCHAR(36), owner_uuid VARCHAR(36), name VARCHAR(100), PRIMARY KEY(uuid))"); + createStatement.addBatch("CREATE TABLE IF NOT EXISTS " + tablePrefix + "_fixed (owner_uuid VARCHAR(36), id SMALLINT, particle_uuid VARCHAR(36), world VARCHAR(100), xPos DOUBLE, yPos DOUBLE, zPos DOUBLE, PRIMARY KEY(owner_uuid, id), FOREIGN KEY(particle_uuid) REFERENCES pp_particle(uuid) ON DELETE CASCADE)"); + createStatement.executeBatch(); + } + } + + } + +} + diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventory.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventory.java index d170575..affcb5c 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventory.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventory.java @@ -13,7 +13,7 @@ import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; +import dev.esophose.playerparticles.manager.SettingManager.Setting; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.util.ParticleUtils; @@ -154,7 +154,7 @@ public abstract class GuiInventory implements InventoryHolder { for (GuiActionButton button : this.actionButtons) { if (button.getSlot() == slot) { button.handleClick(isShiftClick); - if (PSetting.GUI_BUTTON_SOUND.getBoolean() && event.getWhoClicked() instanceof Player) { + if (Setting.GUI_BUTTON_SOUND.getBoolean() && event.getWhoClicked() instanceof Player) { Player player = (Player) event.getWhoClicked(); player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 0.5f, 1); } diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java index 653d212..7199865 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java @@ -1,6 +1,8 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; @@ -26,6 +28,8 @@ public class GuiInventoryDefault extends GuiInventory { public GuiInventoryDefault(PPlayer pplayer) { super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_PLAYERPARTICLES))); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + this.fillBorder(BorderColor.WHITE); // PPlayer information icon @@ -55,8 +59,8 @@ public class GuiInventoryDefault extends GuiInventory { this.inventory.setItem(13, headIcon); // Define what slots to put the icons at based on what other slots are visible - boolean manageGroupsVisible = PermissionManager.canPlayerSaveGroups(pplayer); - boolean loadPresetGroupVisible = !ParticleGroupPresetManager.getPresetGroupsForPlayer(pplayer.getPlayer()).isEmpty(); + boolean manageGroupsVisible = PlayerParticles.getInstance().getManager(PermissionManager.class).canPlayerSaveGroups(pplayer); + boolean loadPresetGroupVisible = !PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class).getPresetGroupsForPlayer(pplayer.getPlayer()).isEmpty(); int manageParticlesSlot = -1, manageGroupsSlot = -1, loadPresetGroupSlot = -1; if (!manageGroupsVisible && !loadPresetGroupVisible) { @@ -79,7 +83,7 @@ public class GuiInventoryDefault extends GuiInventory { GuiIcon.PARTICLES.get(), LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_MANAGE_YOUR_PARTICLES), new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_MANAGE_YOUR_PARTICLES_DESCRIPTION)}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryManageParticles(pplayer))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryManageParticles(pplayer))); this.actionButtons.add(manageYourParticlesButton); // Manage Your Groups button @@ -89,7 +93,7 @@ public class GuiInventoryDefault extends GuiInventory { GuiIcon.GROUPS.get(), LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_MANAGE_YOUR_GROUPS), new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_MANAGE_YOUR_GROUPS_DESCRIPTION)}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryManageGroups(pplayer))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryManageGroups(pplayer))); this.actionButtons.add(manageYourGroupsButton); } @@ -100,7 +104,7 @@ public class GuiInventoryDefault extends GuiInventory { GuiIcon.PRESET_GROUPS.get(), LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_LOAD_A_PRESET_GROUP), new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_LOAD_A_PRESET_GROUP_DESCRIPTION)}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryLoadPresetGroups(pplayer, false))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryLoadPresetGroups(pplayer, false))); this.actionButtons.add(loadPresetGroups); } @@ -116,8 +120,8 @@ public class GuiInventoryDefault extends GuiInventory { new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_EFFECT_DESCRIPTION)}, (button, isShiftClick) -> { List callbacks = new ArrayList<>(); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryDefault(pplayer))); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryDefault(pplayer))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1))); callbacks.add(() -> { ParticleGroup group = pplayer.getActiveParticleGroup(); if (canEditPrimaryStyleAndData) { @@ -130,9 +134,9 @@ public class GuiInventoryDefault extends GuiInventory { } else { group.getParticles().add(editingParticle); } - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + dataManager.saveParticleGroup(pplayer.getUniqueId(), group); - GuiHandler.transition(new GuiInventoryDefault(pplayer)); + GuiManager.transition(new GuiInventoryDefault(pplayer)); }); callbacks.get(1).execute(); @@ -158,8 +162,8 @@ public class GuiInventoryDefault extends GuiInventory { if (!canEditPrimaryStyleAndData) return; List callbacks = new ArrayList<>(); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryDefault(pplayer))); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 1))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryDefault(pplayer))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 1))); callbacks.add(() -> { ParticleGroup group = pplayer.getActiveParticleGroup(); for (ParticlePair particle : group.getParticles()) { @@ -168,9 +172,9 @@ public class GuiInventoryDefault extends GuiInventory { break; } } - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + dataManager.saveParticleGroup(pplayer.getUniqueId(), group); - GuiHandler.transition(new GuiInventoryDefault(pplayer)); + GuiManager.transition(new GuiInventoryDefault(pplayer)); }); callbacks.get(1).execute(); @@ -201,8 +205,8 @@ public class GuiInventoryDefault extends GuiInventory { if (!canEditPrimaryStyleAndData || !doesEffectUseData) return; List callbacks = new ArrayList<>(); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryDefault(pplayer))); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryDefault(pplayer))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1))); callbacks.add(() -> { ParticleGroup group = pplayer.getActiveParticleGroup(); for (ParticlePair particle : group.getParticles()) { @@ -214,9 +218,9 @@ public class GuiInventoryDefault extends GuiInventory { break; } } - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + dataManager.saveParticleGroup(pplayer.getUniqueId(), group); - GuiHandler.transition(new GuiInventoryDefault(pplayer)); + GuiManager.transition(new GuiInventoryDefault(pplayer)); }); callbacks.get(1).execute(); diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditData.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditData.java index 823aa99..3fb7ff5 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditData.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditData.java @@ -1,5 +1,6 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; @@ -308,7 +309,7 @@ public class GuiInventoryEditData extends GuiInventory { GuiIcon.PREVIOUS_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); this.actionButtons.add(previousPageButton); } @@ -319,7 +320,7 @@ public class GuiInventoryEditData extends GuiInventory { GuiIcon.NEXT_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); this.actionButtons.add(nextPageButton); } } @@ -369,7 +370,7 @@ public class GuiInventoryEditData extends GuiInventory { GuiIcon.PREVIOUS_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); this.actionButtons.add(previousPageButton); } @@ -380,7 +381,7 @@ public class GuiInventoryEditData extends GuiInventory { GuiIcon.NEXT_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); this.actionButtons.add(nextPageButton); } } @@ -430,7 +431,7 @@ public class GuiInventoryEditData extends GuiInventory { GuiIcon.PREVIOUS_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); this.actionButtons.add(previousPageButton); } @@ -441,7 +442,7 @@ public class GuiInventoryEditData extends GuiInventory { GuiIcon.NEXT_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); this.actionButtons.add(nextPageButton); } } diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditEffect.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditEffect.java index c4fea01..0f39584 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditEffect.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditEffect.java @@ -1,5 +1,7 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.PermissionManager; @@ -20,7 +22,7 @@ public class GuiInventoryEditEffect extends GuiInventory { this.fillBorder(BorderColor.LIGHT_BLUE); // Select Effect Buttons - List effectsUserHasPermissionFor = PermissionManager.getEffectsUserHasPermissionFor(pplayer.getPlayer()); + List effectsUserHasPermissionFor = PlayerParticles.getInstance().getManager(PermissionManager.class).getEffectsUserHasPermissionFor(pplayer.getPlayer()); int numberOfItems = effectsUserHasPermissionFor.size(); int itemsPerPage = 28; int maxPages = (int) Math.ceil((double) numberOfItems / itemsPerPage); @@ -65,7 +67,7 @@ public class GuiInventoryEditEffect extends GuiInventory { GuiIcon.PREVIOUS_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditEffect(pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); this.actionButtons.add(previousPageButton); } @@ -76,7 +78,7 @@ public class GuiInventoryEditEffect extends GuiInventory { GuiIcon.NEXT_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditEffect(pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); this.actionButtons.add(nextPageButton); } diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditParticle.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditParticle.java index e3163c3..3c44bdf 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditParticle.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditParticle.java @@ -1,6 +1,8 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; @@ -18,6 +20,8 @@ public class GuiInventoryEditParticle extends GuiInventory { public GuiInventoryEditParticle(PPlayer pplayer, ParticlePair editingParticle) { super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_EDITING_PARTICLE, editingParticle.getId()))); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + this.fillBorder(BorderColor.RED); // Particle Info Icon @@ -38,8 +42,8 @@ public class GuiInventoryEditParticle extends GuiInventory { new String[]{LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_EDIT_EFFECT_DESCRIPTION)}, (button, isShiftClick) -> { List callbacks = new ArrayList<>(); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle))); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditParticle(pplayer, editingParticle))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1))); callbacks.add(() -> { ParticleGroup group = pplayer.getActiveParticleGroup(); for (ParticlePair particle : group.getParticles()) { @@ -48,9 +52,9 @@ public class GuiInventoryEditParticle extends GuiInventory { break; } } - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + dataManager.saveParticleGroup(pplayer.getUniqueId(), group); - GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)); + GuiManager.transition(new GuiInventoryEditParticle(pplayer, editingParticle)); }); callbacks.get(1).execute(); @@ -64,8 +68,8 @@ public class GuiInventoryEditParticle extends GuiInventory { new String[]{LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_EDIT_STYLE_DESCRIPTION)}, (button, isShiftClick) -> { List callbacks = new ArrayList<>(); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle))); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 1))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditParticle(pplayer, editingParticle))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 1))); callbacks.add(() -> { ParticleGroup group = pplayer.getActiveParticleGroup(); for (ParticlePair particle : group.getParticles()) { @@ -74,9 +78,9 @@ public class GuiInventoryEditParticle extends GuiInventory { break; } } - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + dataManager.saveParticleGroup(pplayer.getUniqueId(), group); - GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)); + GuiManager.transition(new GuiInventoryEditParticle(pplayer, editingParticle)); }); callbacks.get(1).execute(); @@ -93,8 +97,8 @@ public class GuiInventoryEditParticle extends GuiInventory { (button, isShiftClick) -> { if (usesData) { List callbacks = new ArrayList<>(); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle))); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditParticle(pplayer, editingParticle))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1))); callbacks.add(() -> { ParticleGroup group = pplayer.getActiveParticleGroup(); for (ParticlePair particle : group.getParticles()) { @@ -106,9 +110,9 @@ public class GuiInventoryEditParticle extends GuiInventory { break; } } - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + dataManager.saveParticleGroup(pplayer.getUniqueId(), group); - GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)); + GuiManager.transition(new GuiInventoryEditParticle(pplayer, editingParticle)); }); callbacks.get(1).execute(); @@ -122,7 +126,7 @@ public class GuiInventoryEditParticle extends GuiInventory { GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryManageParticles(pplayer))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryManageParticles(pplayer))); this.actionButtons.add(backButton); this.populate(); diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditStyle.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditStyle.java index d59b434..cf8fcb0 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditStyle.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditStyle.java @@ -1,5 +1,7 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.PermissionManager; @@ -20,7 +22,7 @@ public class GuiInventoryEditStyle extends GuiInventory { this.fillBorder(BorderColor.BLUE); // Select Style Buttons - List stylesUserHasPermissionFor = PermissionManager.getStylesUserHasPermissionFor(pplayer.getPlayer()); + List stylesUserHasPermissionFor = PlayerParticles.getInstance().getManager(PermissionManager.class).getStylesUserHasPermissionFor(pplayer.getPlayer()); int numberOfItems = stylesUserHasPermissionFor.size(); int itemsPerPage = 28; int maxPages = (int) Math.ceil((double) numberOfItems / itemsPerPage); @@ -65,7 +67,7 @@ public class GuiInventoryEditStyle extends GuiInventory { GuiIcon.PREVIOUS_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditStyle(pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition))); this.actionButtons.add(previousPageButton); } @@ -76,7 +78,7 @@ public class GuiInventoryEditStyle extends GuiInventory { GuiIcon.NEXT_PAGE.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryEditStyle(pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition))); this.actionButtons.add(nextPageButton); } diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java index 470e379..8439505 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java @@ -1,11 +1,13 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; +import dev.esophose.playerparticles.manager.SettingManager.Setting; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticleGroupPreset; @@ -22,6 +24,8 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { public GuiInventoryLoadPresetGroups(PPlayer pplayer, boolean isEndPoint) { super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_LOAD_A_PRESET_GROUP))); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + this.fillBorder(BorderColor.GREEN); Player player = pplayer.getPlayer(); @@ -29,7 +33,7 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { int index = 10; int nextWrap = 17; int maxIndex = 43; - List groups = ParticleGroupPresetManager.getPresetGroupsForPlayer(pplayer.getPlayer()); + List groups = PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class).getPresetGroupsForPlayer(pplayer.getPlayer()); for (ParticleGroupPreset group : groups) { if (!group.getGroup().canPlayerUse(player)) continue; @@ -51,9 +55,9 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { activeGroup.getParticles().clear(); for (ParticlePair particle : particles) activeGroup.getParticles().add(particle.clone()); - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); - if (PSetting.GUI_CLOSE_AFTER_GROUP_SELECTED.getBoolean()) { + if (Setting.GUI_CLOSE_AFTER_GROUP_SELECTED.getBoolean()) { pplayer.getPlayer().closeInventory(); } }); @@ -73,7 +77,7 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { INVENTORY_SIZE - 1, GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryDefault(pplayer))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryDefault(pplayer))); this.actionButtons.add(backButton); } else { // Reset Particles Button @@ -84,7 +88,7 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { new String[]{LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_RESET_PARTICLES_DESCRIPTION)}, (button, isShiftClick) -> { // Reset particles - DataManager.saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup()); + dataManager.saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup()); }); this.actionButtons.add(resetParticles); } diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java index 6f84dc5..89a6120 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java @@ -1,13 +1,15 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.gui.hook.PlayerChatHook; import dev.esophose.playerparticles.gui.hook.PlayerChatHookData; import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; +import dev.esophose.playerparticles.manager.SettingManager.Setting; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticlePair; @@ -23,6 +25,8 @@ public class GuiInventoryManageGroups extends GuiInventory { public GuiInventoryManageGroups(PPlayer pplayer) { super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_MANAGE_YOUR_GROUPS))); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + this.fillBorder(BorderColor.BROWN); int index = 10; @@ -54,7 +58,7 @@ public class GuiInventoryManageGroups extends GuiInventory { lore, (button, isShiftClick) -> { if (isShiftClick) { - DataManager.removeParticleGroup(pplayer.getUniqueId(), group); + dataManager.removeParticleGroup(pplayer.getUniqueId(), group); this.actionButtons.remove(button); this.inventory.setItem(button.getSlot(), null); @@ -63,9 +67,9 @@ public class GuiInventoryManageGroups extends GuiInventory { activeGroup.getParticles().clear(); for (ParticlePair particle : particles) activeGroup.getParticles().add(particle.clone()); - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); - if (PSetting.GUI_CLOSE_AFTER_GROUP_SELECTED.getBoolean()) { + if (Setting.GUI_CLOSE_AFTER_GROUP_SELECTED.getBoolean()) { pplayer.getPlayer().closeInventory(); } } @@ -80,7 +84,7 @@ public class GuiInventoryManageGroups extends GuiInventory { if (index > maxIndex) break; // Overflowed the available space } - boolean hasReachedMax = PermissionManager.hasPlayerReachedMaxGroups(pplayer); + boolean hasReachedMax = PlayerParticles.getInstance().getManager(PermissionManager.class).hasPlayerReachedMaxGroups(pplayer); boolean hasParticles = !pplayer.getActiveParticles().isEmpty(); String[] lore; if (hasReachedMax) { @@ -108,7 +112,7 @@ public class GuiInventoryManageGroups extends GuiInventory { PlayerChatHook.addHook(new PlayerChatHookData(pplayer.getUniqueId(), 15, (textEntered) -> { if (textEntered == null || textEntered.equalsIgnoreCase("cancel")) { - GuiHandler.transition(new GuiInventoryManageGroups(pplayer)); + GuiManager.transition(new GuiInventoryManageGroups(pplayer)); } else { String groupName = textEntered.split(" ")[0]; @@ -136,14 +140,14 @@ public class GuiInventoryManageGroups extends GuiInventory { } // Apply changes and notify player - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + dataManager.saveParticleGroup(pplayer.getUniqueId(), group); if (groupUpdated) { LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_SUCCESS_OVERWRITE, groupName); } else { LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_SUCCESS, groupName); } - GuiHandler.transition(new GuiInventoryManageGroups(pplayer)); + GuiManager.transition(new GuiInventoryManageGroups(pplayer)); } })); pplayer.getPlayer().closeInventory(); @@ -156,7 +160,7 @@ public class GuiInventoryManageGroups extends GuiInventory { GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryDefault(pplayer))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryDefault(pplayer))); this.actionButtons.add(backButton); this.populate(); diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageParticles.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageParticles.java index 23f9f79..10f6926 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageParticles.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageParticles.java @@ -1,6 +1,8 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.LangManager; import dev.esophose.playerparticles.manager.LangManager.Lang; import dev.esophose.playerparticles.manager.PermissionManager; @@ -21,6 +23,8 @@ public class GuiInventoryManageParticles extends GuiInventory { public GuiInventoryManageParticles(PPlayer pplayer) { super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_MANAGE_YOUR_PARTICLES))); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + this.fillBorder(BorderColor.ORANGE); // Manage/Delete Particle Buttons @@ -42,7 +46,7 @@ public class GuiInventoryManageParticles extends GuiInventory { }, (button, isShiftClick) -> { if (!isShiftClick) { - GuiHandler.transition(new GuiInventoryEditParticle(pplayer, particle)); + GuiManager.transition(new GuiInventoryEditParticle(pplayer, particle)); } else { // Delete particle ParticleGroup activeGroup = pplayer.getActiveParticleGroup(); @@ -52,7 +56,7 @@ public class GuiInventoryManageParticles extends GuiInventory { break; } } - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); // Update inventory to reflect deletion this.actionButtons.remove(button); @@ -70,7 +74,7 @@ public class GuiInventoryManageParticles extends GuiInventory { } // Create New Particle Button - boolean canCreate = pplayer.getActiveParticles().size() < PermissionManager.getMaxParticlesAllowed(pplayer.getPlayer()); + boolean canCreate = pplayer.getActiveParticles().size() < PlayerParticles.getInstance().getManager(PermissionManager.class).getMaxParticlesAllowed(pplayer.getPlayer()); String lore = LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_CREATE_PARTICLE_DESCRIPTION); GuiActionButton createNewParticle = new GuiActionButton( 38, @@ -81,12 +85,12 @@ public class GuiInventoryManageParticles extends GuiInventory { if (!canCreate) return; ParticlePair editingParticle = ParticlePair.getNextDefault(pplayer); List callbacks = new ArrayList<>(); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryManageParticles(pplayer))); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1))); - callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 2))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryManageParticles(pplayer))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1))); + callbacks.add(() -> GuiManager.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 2))); callbacks.add(() -> { if (editingParticle.getEffect().hasProperty(ParticleProperty.COLORABLE) || editingParticle.getEffect().hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) { - GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 3)); + GuiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 3)); } else { callbacks.get(4).execute(); } @@ -95,10 +99,10 @@ public class GuiInventoryManageParticles extends GuiInventory { // Save new particle ParticleGroup group = pplayer.getActiveParticleGroup(); group.getParticles().add(editingParticle); - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); + dataManager.saveParticleGroup(pplayer.getUniqueId(), group); // Reopen the manage particle inventory - GuiHandler.transition(new GuiInventoryManageParticles(pplayer)); + GuiManager.transition(new GuiInventoryManageParticles(pplayer)); }); callbacks.get(1).execute(); }); @@ -111,10 +115,10 @@ public class GuiInventoryManageParticles extends GuiInventory { new String[]{LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_RESET_PARTICLES_DESCRIPTION)}, (button, isShiftClick) -> { // Reset particles - DataManager.saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup()); + dataManager.saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup()); // Reopen this same inventory to refresh it - GuiHandler.transition(new GuiInventoryManageParticles(pplayer)); + GuiManager.transition(new GuiInventoryManageParticles(pplayer)); }); this.actionButtons.add(resetParticles); @@ -124,7 +128,7 @@ public class GuiInventoryManageParticles extends GuiInventory { GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[]{}, - (button, isShiftClick) -> GuiHandler.transition(new GuiInventoryDefault(pplayer))); + (button, isShiftClick) -> GuiManager.transition(new GuiInventoryDefault(pplayer))); this.actionButtons.add(backButton); this.populate(); diff --git a/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHook.java b/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHook.java index 25a7e7d..c8b666a 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHook.java +++ b/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHook.java @@ -31,7 +31,7 @@ public class PlayerChatHook extends BukkitRunnable implements Listener { hooks = new HashSet<>(); if (hookTask != null) hookTask.cancel(); - hookTask = new PlayerChatHook().runTaskTimer(PlayerParticles.getPlugin(), 0, 20); + hookTask = new PlayerChatHook().runTaskTimer(PlayerParticles.getInstance(), 0, 20); } /** @@ -45,7 +45,7 @@ public class PlayerChatHook extends BukkitRunnable implements Listener { if (hook.getPlayerUUID().equals(event.getPlayer().getUniqueId())) { event.setCancelled(true); hooks.remove(hook); - Bukkit.getScheduler().scheduleSyncDelayedTask(PlayerParticles.getPlugin(), () -> hook.triggerCallback(event.getMessage())); + Bukkit.getScheduler().scheduleSyncDelayedTask(PlayerParticles.getInstance(), () -> hook.triggerCallback(event.getMessage())); return; } } diff --git a/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHookData.java b/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHookData.java index 27af102..b7d9430 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHookData.java +++ b/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHookData.java @@ -1,15 +1,16 @@ package dev.esophose.playerparticles.gui.hook; import java.util.UUID; +import java.util.function.Consumer; public class PlayerChatHookData { private UUID playerUUID; private int maxHookLength; private int hookLength; - private PlayerChatHookCallback hookCallback; + private Consumer hookCallback; - public PlayerChatHookData(UUID playerUUID, int hookLength, PlayerChatHookCallback hookCallback) { + public PlayerChatHookData(UUID playerUUID, int hookLength, Consumer hookCallback) { this.playerUUID = playerUUID; this.maxHookLength = hookLength; this.hookLength = hookLength; @@ -65,15 +66,7 @@ public class PlayerChatHookData { * @param textEntered The text that was entered by the player */ public void triggerCallback(String textEntered) { - this.hookCallback.onPlayerChat(textEntered); - } - - /** - * Allows simple hooking into the player chat for a specific time interval - */ - @FunctionalInterface - public interface PlayerChatHookCallback { - void onPlayerChat(String textEntered); + this.hookCallback.accept(textEntered); } } diff --git a/src/main/java/dev/esophose/playerparticles/locale/EnglishLocale.java b/src/main/java/dev/esophose/playerparticles/locale/EnglishLocale.java new file mode 100644 index 0000000..489cc6a --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/locale/EnglishLocale.java @@ -0,0 +1,303 @@ +package dev.esophose.playerparticles.locale; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class EnglishLocale implements Locale { + + @Override + public String getLocaleName() { + return "en_US"; + } + + @Override + public String getTranslatorName() { + return "Esophose"; + } + + @Override + public Map getDefaultLocaleStrings() { + return new LinkedHashMap() {{ + // Plugin Prefix + this.put("prefix", "&7[&3PlayerParticles&7] "); + + // Command Errors + this.put("command-error-no-effects", "&cYou must have access to effects to use this command!"); + this.put("command-error-unknown", "&cUnknown command, use &b/pp help &cfor a list of commands."); + + // Command Descriptions + this.put("command-descriptions", "&eThe following commands are available:"); + this.put("command-descriptions-usage", "&e/pp {0} {1}"); + this.put("command-descriptions-help-1", "&7> &b/pp {0} &e- {1}"); + this.put("command-descriptions-help-2", "&7> &b/pp {0} {1} &e- {2}"); + this.put("command-descriptions-help-other", "&7> &b/ppo &e- Run a /pp command as a player"); + this.put("command-description-add", "Add a new particle"); + this.put("command-description-data", "Check what type of data an effect uses"); + this.put("command-description-default", "The main command. By default, opens the GUI"); + this.put("command-description-edit", "Edit a particle"); + this.put("command-description-effects", "Display a list of effects you can use"); + this.put("command-description-fixed", "Manage your fixed effects"); + this.put("command-description-group", "Manage your groups"); + this.put("command-description-gui", "Display the GUI for easy editing of particles"); + this.put("command-description-help", "Displays the help menu... You have arrived"); + this.put("command-description-info", "Gets the description of one of your active particles"); + this.put("command-description-list", "Lists the IDs of your active particles"); + this.put("command-description-reload", "Reloads the config.yml and lang file"); + this.put("command-description-remove", "Removes some particles"); + this.put("command-description-reset", "Removes all your active particles"); + this.put("command-description-styles", "Display a list of styles you can use"); + this.put("command-description-toggle", "Toggles particle visibility on/off"); + this.put("command-description-version", "Display the plugin version and author"); + this.put("command-description-worlds", "Find out what worlds particles are disabled in"); + + // Sub-Command Usage + this.put("command-description-fixed-create", "&e/pp fixed create < |>