diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..0e12312 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,17 @@ +name: Java CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Gradle + run: ./gradlew build diff --git a/.gitignore b/.gitignore index 45e7ff1..539988a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,31 +1,9 @@ -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.settings -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* /.gradle/ /.settings/ .idea/ build/ target/ *.iml -/bin/ \ No newline at end of file +/bin/ +/doc/ +/images/ diff --git a/build.gradle b/build.gradle index 3b507dc..a551f47 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' @@ -16,19 +17,21 @@ repositories { maven { url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } maven { url = 'https://repo.codemc.org/repository/maven-public' } + maven { url = 'http://repo.extendedclip.com/content/repositories/placeholderapi/' } } dependencies { compile 'org.slf4j:slf4j-api:1.7.25' compile 'org.slf4j:slf4j-nop:1.7.25' compile 'com.zaxxer:HikariCP:3.2.0' - compile 'com.googlecode.json-simple:json-simple:1.1.1' - shadow 'org.xerial:sqlite-jdbc:3.23.1' - shadow 'org.spigotmc:spigot-api:1.14.3-R0.1-SNAPSHOT' + shadow 'me.clip:placeholderapi:2.10.4' + shadow 'org.xerial:sqlite-jdbc:3.23.1' + shadow 'org.spigotmc:spigot-api:1.15-R0.1-SNAPSHOT' } shadowJar { archiveClassifier.set(null) + minimize() } processResources { diff --git a/changelog.txt b/changelog.txt index e9f48f9..f397d43 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,22 +1,18 @@ === v7.0 === -* Huge changes -* The config will no longer reset for each and every update -+ Added settings for each effect located in the /effects folder -+ Added settings for each style located in the /styles folder -+ All command and parameter names can now be edited in the new commands.yml file -+ Added support for what I'm calling language packs - - Language packs have the ability to overwrite any message in the plugin -+ Added de_DE language pack -+ Added language settings for all material names which can be changed in a languge pack -* The command '/pp fixed clear ' now accepts an optional location/world as '/pp fixed clear [ [world]]' -+ Added setting 'allow-duplicate-styles' which, when false, will not allow 2 particles with the same style to display at the same time. - - For example, doing '/pp add flame spiral' then '/pp add witchmagic spiral' will only keep the effect of 'witchmagic' -* Effect/Style permissions are no longer required for a player to have particles applied to them - - This mainly changes '/ppo' to allow any command to execute successfully -+ Added a developer API for editing particles, groups, and fixed effects for players -+ Added support for Minecraft 1.15 particles, the future is now - - 'falling_honey', 'falling_nectar', 'landing_honey' -+ Added support for 1.8.8 for those who refuse to accept the future (this is the only version of 1.8.x that will be supported, I will eventually drop support for it again in the future) +* Coming soon +=== v6.6 === ++ Added support for Minecraft 1.15 ++ Added 1.15 effects: 'dripping_honey', 'falling_honey', 'falling_nectar', and 'landing_honey' ++ Added new lang file de_DE.lang (German) +* Fixed an issue where the 'arrows' style wouldn't load properly with preset groups +* Fixed an issue where shooting an arrow into a portal would throw errors +=== v6.5 === ++ Added Russian translation file ru_RU.lang ++ Added slightly better vanish plugin support +* Players no longer need an effect permission to open the GUI when gui-presets-only is true in the config.yml +* Fixed error with the celebration style +* Fixed error with the arrows style in 1.14+ +* Fixed '/pp reload' not being allowed from console === v6.4 === + Added support for Minecraft 1.14 + Added 1.14 effects: 'campfire_cosy_smoke', 'campfire_signal_smoke', 'composter', 'falling_lava', 'falling_water', 'landing_lava', 'sneeze' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..5c2d1cf Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7c4388a..4b7e1f3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 83f2acf..8e25e6c --- a/gradlew +++ b/gradlew @@ -125,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` diff --git a/src/main/java/dev/esophose/playerparticles/PlayerParticles.java b/src/main/java/dev/esophose/playerparticles/PlayerParticles.java index e997821..16bb1bc 100644 --- a/src/main/java/dev/esophose/playerparticles/PlayerParticles.java +++ b/src/main/java/dev/esophose/playerparticles/PlayerParticles.java @@ -1,184 +1,140 @@ /* - * TODO: v6.4 + * TODO: v7.0 + * * Added an API, accessible through the dev.esophose.playerparticles.api.PlayerParticlesAPI class * + Add ability to create/manage fixed effects from the GUI * * Convert fixed effect ids into names * + Add command '/pp fixed teleport ' that requires the permission playerparticles.fixed.teleport - * + Add named colors to the color data + * + Add named colors to the color data autocomplete * * Clean up duplicated command parsing - */ - -/* - * TODO: v6.5 * + Add effect/style name customization through config files * + Add effect/style settings folder that lets you disable effects/style and edit style properties + * + Added PlaceholderAPI support for message strings + * + Added setting to disable particles while in combat + */ + + /* + * * Refactored and cleaned up code to remove static abuse + * * Changed the package names + * + Config and lang files will no longer reset every update + * + Added PlaceholderAPI support (no placeholders, just placeholder replacing in messages) */ 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.CommandManager; +import dev.esophose.playerparticles.manager.ConfigurationManager; +import dev.esophose.playerparticles.manager.ConfigurationManager.Setting; +import dev.esophose.playerparticles.manager.DataMigrationManager; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.manager.Manager; import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; import dev.esophose.playerparticles.manager.ParticleManager; -import dev.esophose.playerparticles.manager.SettingManager; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; +import dev.esophose.playerparticles.manager.ParticleStyleManager; +import dev.esophose.playerparticles.manager.PermissionManager; +import dev.esophose.playerparticles.manager.PluginUpdateManager; 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; + + this.managers = new HashMap<>(); + + this.reload(); 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."); - } - }); - } - - if (PSetting.SEND_METRICS.getBoolean()) { + if (Setting.SEND_METRICS.getBoolean()) new Metrics(this); - } - - this.reload(updatePluginSettings); } - /** - * 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(CommandManager.class); + this.getManager(ParticleStyleManager.class); + this.getManager(ParticleGroupPresetManager.class); + this.getManager(ConfigurationManager.class); + this.getManager(DataMigrationManager.class); + this.getManager(PluginUpdateManager.class); + this.getManager(ParticleManager.class); + this.getManager(LocaleManager.class); + this.getManager(ConfigurationManager.class); + this.getManager(PermissionManager.class); + this.getManager(PluginUpdateManager.class); + PlayerChatHook.setup(); - - ParticleManager.refreshData(); - this.startParticleTask(); } /** @@ -186,61 +142,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..238b78e 100644 --- a/src/main/java/dev/esophose/playerparticles/command/AddCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/AddCommandModule.java @@ -1,18 +1,9 @@ package dev.esophose.playerparticles.command; -import java.util.ArrayList; -import java.util.List; - -import dev.esophose.playerparticles.styles.api.ParticleStyle; -import dev.esophose.playerparticles.styles.api.ParticleStyleManager; -import dev.esophose.playerparticles.util.ParticleUtils; -import org.bukkit.Material; -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; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.manager.ParticleStyleManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleEffect; @@ -21,6 +12,14 @@ import dev.esophose.playerparticles.particles.ParticleEffect.OrdinaryColor; import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticlePair; +import dev.esophose.playerparticles.styles.ParticleStyle; +import dev.esophose.playerparticles.util.ParticleUtils; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.ArrayList; +import java.util.List; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; public class AddCommandModule implements CommandModule { @@ -29,28 +28,31 @@ public class AddCommandModule implements CommandModule { CommandModule.printUsage(pplayer, this); return; } + + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.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); + localeManager.sendMessage(pplayer, "add-reached-max", StringPlaceholders.single("amount", maxParticlesAllowed)); return; } ParticleEffect effect = ParticleEffect.fromName(args[0]); if (effect == null) { - LangManager.sendMessage(pplayer, Lang.EFFECT_INVALID, args[0]); + localeManager.sendMessage(pplayer, "effect-invalid", StringPlaceholders.single("effect", args[0])); return; - } else if (!PermissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { - LangManager.sendMessage(pplayer, Lang.EFFECT_NO_PERMISSION, effect.getName()); + } else if (!permissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { + localeManager.sendMessage(pplayer, "effect-no-permission", StringPlaceholders.single("effect", effect.getName())); return; } ParticleStyle style = ParticleStyle.fromName(args[1]); if (style == null) { - LangManager.sendMessage(pplayer, Lang.STYLE_INVALID, args[1]); + localeManager.sendMessage(pplayer, "style-invalid", StringPlaceholders.single("style", args[1])); return; - } else if (!PermissionManager.hasStylePermission(pplayer.getPlayer(), style)) { - LangManager.sendMessage(pplayer, Lang.STYLE_NO_PERMISSION, args[1]); + } else if (!permissionManager.hasStylePermission(pplayer.getPlayer(), style)) { + localeManager.sendMessage(pplayer, "style-no-permission", StringPlaceholders.single("style", args[1])); return; } @@ -71,12 +73,12 @@ public class AddCommandModule implements CommandModule { try { note = Integer.parseInt(args[2]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_NOTE); + localeManager.sendMessage(pplayer, "data-invalid-note"); return; } if (note < 0 || note > 24) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_NOTE); + localeManager.sendMessage(pplayer, "data-invalid-note"); return; } @@ -95,12 +97,12 @@ public class AddCommandModule implements CommandModule { g = Integer.parseInt(args[3]); b = Integer.parseInt(args[4]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_COLOR); + localeManager.sendMessage(pplayer, "data-invalid-color"); return; } if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_COLOR); + localeManager.sendMessage(pplayer, "data-invalid-color"); return; } @@ -113,7 +115,7 @@ public class AddCommandModule implements CommandModule { blockData = ParticleUtils.closestMatch(args[2]); if (blockData == null || !blockData.isBlock()) throw new Exception(); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_BLOCK); + localeManager.sendMessage(pplayer, "data-invalid-block"); return; } } else if (effect == ParticleEffect.ITEM) { @@ -121,7 +123,7 @@ public class AddCommandModule implements CommandModule { itemData = ParticleUtils.closestMatch(args[2]); if (itemData == null || itemData.isBlock()) throw new Exception(); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_ITEM); + localeManager.sendMessage(pplayer, "data-invalid-item"); return; } } @@ -131,24 +133,28 @@ 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); + + StringPlaceholders addParticlePlaceholders = StringPlaceholders.builder("effect", newParticle.getEffect().getName()) + .addPlaceholder("style", newParticle.getStyle().getName()) + .addPlaceholder("data", newParticle.getDataString()).build(); + localeManager.sendMessage(pplayer, "add-particle-applied", addParticlePlaceholders); - LangManager.sendMessage(pplayer, Lang.ADD_PARTICLE_APPLIED, newParticle.getEffect().getName(), newParticle.getStyle().getName(), newParticle.getDataString()); - - if (ParticleStyleManager.isCustomHandled(newParticle.getStyle())) { - LangManager.sendMessage(pplayer, Lang.STYLE_EVENT_SPAWNING_INFO, newParticle.getStyle().getName()); + if (PlayerParticles.getInstance().getManager(ParticleStyleManager.class).isCustomHandled(newParticle.getStyle())) { + localeManager.sendMessage(pplayer, "style-event-spawning-info", StringPlaceholders.single("style", newParticle.getStyle().getName())); } } 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 +197,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..8cb0327 100644 --- a/src/main/java/dev/esophose/playerparticles/command/CommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/CommandModule.java @@ -1,10 +1,10 @@ package dev.esophose.playerparticles.command; -import java.util.List; - -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.particles.PPlayer; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.List; public interface CommandModule { @@ -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 @@ -65,7 +65,8 @@ public interface CommandModule { * @param command The command to display usage for */ static void printUsage(PPlayer pplayer, CommandModule command) { - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTIONS_USAGE, command.getName(), command.getArguments()); + StringPlaceholders placeholders = StringPlaceholders.builder("cmd", command.getName()).addPlaceholder("args", command.getArguments()).build(); + PlayerParticles.getInstance().getManager(LocaleManager.class).sendMessage(pplayer, "command-descriptions-usage", placeholders); } /** @@ -75,10 +76,18 @@ public interface CommandModule { * @param command The command to display usage for */ static void printUsageWithDescription(PPlayer pplayer, CommandModule command) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); if (command.getArguments().length() == 0) { - LangManager.sendSimpleMessage(pplayer, Lang.COMMAND_DESCRIPTIONS_HELP_1, command.getName(), LangManager.getText(command.getDescription())); + StringPlaceholders placeholders = StringPlaceholders.builder("cmd", command.getName()) + .addPlaceholder("desc", localeManager.getLocaleMessage(command.getDescriptionKey())) + .build(); + localeManager.sendSimpleMessage(pplayer, "command-descriptions-help-1", placeholders); } else { - LangManager.sendSimpleMessage(pplayer, Lang.COMMAND_DESCRIPTIONS_HELP_2, command.getName(), command.getArguments(), LangManager.getText(command.getDescription())); + StringPlaceholders placeholders = StringPlaceholders.builder("cmd", command.getName()) + .addPlaceholder("args", command.getArguments()) + .addPlaceholder("desc", localeManager.getLocaleMessage(command.getDescriptionKey())) + .build(); + localeManager.sendSimpleMessage(pplayer, "command-descriptions-help-2", placeholders); } } diff --git a/src/main/java/dev/esophose/playerparticles/command/CommandModuleSecondary.java b/src/main/java/dev/esophose/playerparticles/command/CommandModuleSecondary.java index 8175601..72a03cc 100644 --- a/src/main/java/dev/esophose/playerparticles/command/CommandModuleSecondary.java +++ b/src/main/java/dev/esophose/playerparticles/command/CommandModuleSecondary.java @@ -1,7 +1,6 @@ package dev.esophose.playerparticles.command; import java.util.List; - import org.bukkit.command.CommandSender; public interface CommandModuleSecondary { diff --git a/src/main/java/dev/esophose/playerparticles/command/DataCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/DataCommandModule.java index 18264e9..7eec020 100644 --- a/src/main/java/dev/esophose/playerparticles/command/DataCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/DataCommandModule.java @@ -1,52 +1,57 @@ package dev.esophose.playerparticles.command; -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.util.StringUtil; - -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleEffect; import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.ArrayList; +import java.util.List; +import org.bukkit.util.StringUtil; public class DataCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + if (args.length > 0) { ParticleEffect effect = ParticleEffect.fromName(args[0]); if (effect == null) { - LangManager.sendMessage(pplayer, Lang.EFFECT_INVALID, args[0]); + localeManager.sendMessage(pplayer, "effect-invalid", StringPlaceholders.single("effect", args[0])); return; } if (effect.hasProperty(ParticleProperty.COLORABLE)) { if (effect == ParticleEffect.NOTE) { - LangManager.sendMessage(pplayer, Lang.DATA_USAGE_NOTE, effect.getName()); + localeManager.sendMessage(pplayer, "data-usage-note", StringPlaceholders.single("effect", effect.getName())); } else { - LangManager.sendMessage(pplayer, Lang.DATA_USAGE_COLOR, effect.getName()); + localeManager.sendMessage(pplayer, "data-usage-color", StringPlaceholders.single("effect", effect.getName())); } } else if (effect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) { if (effect == ParticleEffect.ITEM) { - LangManager.sendMessage(pplayer, Lang.DATA_USAGE_ITEM, effect.getName()); + localeManager.sendMessage(pplayer, "data-usage-item", StringPlaceholders.single("effect", effect.getName())); } else { - LangManager.sendMessage(pplayer, Lang.DATA_USAGE_BLOCK, effect.getName()); + localeManager.sendMessage(pplayer, "data-usage-block", StringPlaceholders.single("effect", effect.getName())); } } else { - LangManager.sendMessage(pplayer, Lang.DATA_USAGE_NONE, effect.getName()); + localeManager.sendMessage(pplayer, "data-usage-none", StringPlaceholders.single("effect", effect.getName())); } } else { - LangManager.sendMessage(pplayer, Lang.DATA_NO_ARGS); + localeManager.sendMessage(pplayer, "data-no-args"); } } 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..102efb4 100644 --- a/src/main/java/dev/esophose/playerparticles/command/DefaultCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/DefaultCommandModule.java @@ -1,23 +1,22 @@ package dev.esophose.playerparticles.command; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.CommandManager; +import dev.esophose.playerparticles.particles.PPlayer; import java.util.ArrayList; import java.util.List; - import org.bukkit.util.StringUtil; -import dev.esophose.playerparticles.manager.LangManager.Lang; -import dev.esophose.playerparticles.particles.PPlayer; - 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 +29,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..54a9646 100644 --- a/src/main/java/dev/esophose/playerparticles/command/EditCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/EditCommandModule.java @@ -1,29 +1,30 @@ package dev.esophose.playerparticles.command; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.manager.PermissionManager; +import dev.esophose.playerparticles.particles.PPlayer; +import dev.esophose.playerparticles.particles.ParticleEffect; +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.ParticleGroup; +import dev.esophose.playerparticles.particles.ParticlePair; +import dev.esophose.playerparticles.styles.ParticleStyle; +import dev.esophose.playerparticles.util.ParticleUtils; +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.ArrayList; import java.util.List; - -import dev.esophose.playerparticles.styles.api.ParticleStyle; -import dev.esophose.playerparticles.util.ParticleUtils; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; -import dev.esophose.playerparticles.manager.DataManager; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.PermissionManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -import dev.esophose.playerparticles.particles.PPlayer; -import dev.esophose.playerparticles.particles.ParticleEffect; -import dev.esophose.playerparticles.particles.ParticleGroup; -import dev.esophose.playerparticles.particles.ParticlePair; -import dev.esophose.playerparticles.particles.ParticleEffect.NoteColor; -import dev.esophose.playerparticles.particles.ParticleEffect.OrdinaryColor; -import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty; - public class EditCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + if (args.length < 3) { CommandModule.printUsage(pplayer, this); return; @@ -33,17 +34,17 @@ public class EditCommandModule implements CommandModule { try { id = Integer.parseInt(args[0]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.ID_INVALID); + localeManager.sendMessage(pplayer, "id-invalid"); return; } if (id <= 0) { - LangManager.sendMessage(pplayer, Lang.ID_INVALID); + localeManager.sendMessage(pplayer, "id-invalid"); return; } if (pplayer.getActiveParticle(id) == null) { - LangManager.sendMessage(pplayer, Lang.ID_UNKNOWN, id); + localeManager.sendMessage(pplayer, "id-unknown", StringPlaceholders.single("id", id)); return; } @@ -61,7 +62,7 @@ public class EditCommandModule implements CommandModule { this.editData(pplayer, id, cmdArgs); break; default: - LangManager.sendMessage(pplayer, Lang.EDIT_INVALID_PROPERTY, args[1]); + localeManager.sendMessage(pplayer, "edit-invalid-property", StringPlaceholders.single("prop", args[1])); break; } } @@ -74,12 +75,14 @@ public class EditCommandModule implements CommandModule { * @param args The rest of the args */ private void editEffect(PPlayer pplayer, int id, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + ParticleEffect effect = ParticleEffect.fromName(args[0]); if (effect == null) { - LangManager.sendMessage(pplayer, Lang.EFFECT_INVALID, args[0]); + localeManager.sendMessage(pplayer, "effect-invalid", StringPlaceholders.single("effect", args[0])); return; - } else if (!PermissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { - LangManager.sendMessage(pplayer, Lang.EFFECT_NO_PERMISSION, effect.getName()); + } else if (!PlayerParticles.getInstance().getManager(PermissionManager.class).hasEffectPermission(pplayer.getPlayer(), effect)) { + localeManager.sendMessage(pplayer, "effect-no-permission", StringPlaceholders.single("effect", effect.getName())); return; } @@ -91,8 +94,8 @@ public class EditCommandModule implements CommandModule { } } - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); - LangManager.sendMessage(pplayer, Lang.EDIT_SUCCESS_EFFECT, id, effect.getName()); + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), group); + localeManager.sendMessage(pplayer, "edit-success-effect", StringPlaceholders.builder("id", id).addPlaceholder("effect", effect.getName()).build()); } /** @@ -103,12 +106,14 @@ public class EditCommandModule implements CommandModule { * @param args The rest of the args */ private void editStyle(PPlayer pplayer, int id, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + ParticleStyle style = ParticleStyle.fromName(args[0]); if (style == null) { - LangManager.sendMessage(pplayer, Lang.STYLE_INVALID, args[0]); + localeManager.sendMessage(pplayer, "style-invalid", StringPlaceholders.single("style", args[0])); return; - } else if (!PermissionManager.hasStylePermission(pplayer.getPlayer(), style)) { - LangManager.sendMessage(pplayer, Lang.STYLE_NO_PERMISSION, style.getName()); + } else if (!PlayerParticles.getInstance().getManager(PermissionManager.class).hasStylePermission(pplayer.getPlayer(), style)) { + localeManager.sendMessage(pplayer, "style-no-permission", StringPlaceholders.single("style", style.getName())); return; } @@ -119,9 +124,9 @@ public class EditCommandModule implements CommandModule { break; } } - - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); - LangManager.sendMessage(pplayer, Lang.EDIT_SUCCESS_STYLE, id, style.getName()); + + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), group); + localeManager.sendMessage(pplayer, "edit-success-style", StringPlaceholders.builder("id", id).addPlaceholder("style", style.getName()).build()); } /** @@ -132,6 +137,8 @@ public class EditCommandModule implements CommandModule { * @param args The rest of the args */ private void editData(PPlayer pplayer, int id, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + Material itemData = null; Material blockData = null; OrdinaryColor colorData = null; @@ -150,12 +157,12 @@ public class EditCommandModule implements CommandModule { try { note = Integer.parseInt(args[0]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_NOTE); + localeManager.sendMessage(pplayer, "data-invalid-note"); return; } if (note < 0 || note > 24) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_NOTE); + localeManager.sendMessage(pplayer, "data-invalid-note"); return; } @@ -174,12 +181,12 @@ public class EditCommandModule implements CommandModule { g = Integer.parseInt(args[1]); b = Integer.parseInt(args[2]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_COLOR); + localeManager.sendMessage(pplayer, "data-invalid-color"); return; } if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_COLOR); + localeManager.sendMessage(pplayer, "data-invalid-color"); return; } @@ -192,7 +199,7 @@ public class EditCommandModule implements CommandModule { blockData = ParticleUtils.closestMatch(args[0]); if (blockData == null || !blockData.isBlock()) throw new Exception(); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_BLOCK); + localeManager.sendMessage(pplayer, "data-invalid-block"); return; } } else if (effect == ParticleEffect.ITEM) { @@ -200,7 +207,7 @@ public class EditCommandModule implements CommandModule { itemData = ParticleUtils.closestMatch(args[0]); if (itemData == null || itemData.isBlock()) throw new Exception(); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.DATA_INVALID_ITEM); + localeManager.sendMessage(pplayer, "data-invalid-item"); return; } } @@ -218,12 +225,13 @@ public class EditCommandModule implements CommandModule { break; } } - - DataManager.saveParticleGroup(pplayer.getUniqueId(), group); - LangManager.sendMessage(pplayer, Lang.EDIT_SUCCESS_DATA, id, updatedDataString); + + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), group); + localeManager.sendMessage(pplayer, "edit-success-data", StringPlaceholders.builder("id", id).addPlaceholder("data", updatedDataString).build()); } 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 +261,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 +310,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..606be2d 100644 --- a/src/main/java/dev/esophose/playerparticles/command/EffectsCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/EffectsCommandModule.java @@ -1,23 +1,24 @@ package dev.esophose.playerparticles.command; -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.entity.Player; - -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.PPlayer; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.ArrayList; +import java.util.List; +import org.bukkit.entity.Player; public class EffectsCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + 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); + localeManager.sendMessage(pplayer, "effect-list-empty"); return; } @@ -30,7 +31,7 @@ public class EffectsCommandModule implements CommandModule { toSend = new StringBuilder(toSend.substring(0, toSend.length() - 2)); } - LangManager.sendMessage(pplayer, Lang.EFFECT_LIST, toSend.toString()); + localeManager.sendMessage(pplayer, "effect-list", StringPlaceholders.single("effects", toSend.toString())); } public List onTabComplete(PPlayer pplayer, String[] args) { @@ -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..ded9527 100644 --- a/src/main/java/dev/esophose/playerparticles/command/FixedCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/FixedCommandModule.java @@ -1,24 +1,8 @@ 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; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.ParticleManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.FixedParticleEffect; @@ -28,24 +12,41 @@ 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.ParticleStyle; +import dev.esophose.playerparticles.util.ParticleUtils; +import dev.esophose.playerparticles.util.StringPlaceholders; +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 org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; public class FixedCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + Player p = pplayer.getPlayer(); - if (!PermissionManager.canUseFixedEffects(p)) { - LangManager.sendMessage(pplayer, Lang.FIXED_NO_PERMISSION); + if (!PlayerParticles.getInstance().getManager(PermissionManager.class).canUseFixedEffects(p)) { + localeManager.sendMessage(pplayer, "fixed-no-permission"); return; } if (args.length == 0) { // General information on command - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_CREATE); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_EDIT); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_REMOVE); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_LIST); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_INFO); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_CLEAR); + localeManager.sendMessage(pplayer, "command-description-fixed-create"); + localeManager.sendMessage(pplayer, "command-description-fixed-edit"); + localeManager.sendMessage(pplayer, "command-description-fixed-remove"); + localeManager.sendMessage(pplayer, "command-description-fixed-list"); + localeManager.sendMessage(pplayer, "command-description-fixed-info"); + localeManager.sendMessage(pplayer, "command-description-fixed-clear"); return; } @@ -74,13 +75,13 @@ public class FixedCommandModule implements CommandModule { this.handleClear(pplayer, p, cmdArgs); return; default: - LangManager.sendMessage(pplayer, Lang.FIXED_INVALID_COMMAND); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_CREATE); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_EDIT); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_REMOVE); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_LIST); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_INFO); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_CLEAR); + localeManager.sendMessage(pplayer, "fixed-invalid-command"); + localeManager.sendMessage(pplayer, "command-description-fixed-create"); + localeManager.sendMessage(pplayer, "command-description-fixed-edit"); + localeManager.sendMessage(pplayer, "command-description-fixed-remove"); + localeManager.sendMessage(pplayer, "command-description-fixed-list"); + localeManager.sendMessage(pplayer, "command-description-fixed-info"); + localeManager.sendMessage(pplayer, "command-description-fixed-clear"); } } @@ -92,24 +93,26 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleCreate(PPlayer pplayer, Player p, String[] args) { - boolean reachedMax = PermissionManager.hasPlayerReachedMaxFixedEffects(pplayer); + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + boolean reachedMax = permissionManager.hasPlayerReachedMaxFixedEffects(pplayer); if (reachedMax) { - LangManager.sendMessage(pplayer, Lang.FIXED_MAX_REACHED); + localeManager.sendMessage(pplayer, "fixed-max-reached"); return; } if (args.length < 5 && !(args.length > 0 && args[0].equalsIgnoreCase("looking") && args.length >= 3)) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_MISSING_ARGS, 5 - args.length); + localeManager.sendMessage(pplayer, "fixed-create-missing-args", StringPlaceholders.single("amount", 5 - args.length)); return; } double xPos, yPos, zPos; if (args[0].equalsIgnoreCase("looking")) { - Block targetBlock = p.getTargetBlock((Set) null, 8); + Block targetBlock = p.getTargetBlock((Set) null, 8); // Need the Set cast for 1.9 support int maxDistanceSqrd = 6 * 6; if (targetBlock.getLocation().distanceSquared(p.getLocation()) > maxDistanceSqrd) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_LOOKING_TOO_FAR); + localeManager.sendMessage(pplayer, "fixed-create-looking-too-far"); return; } @@ -149,38 +152,38 @@ public class FixedCommandModule implements CommandModule { zPos = Double.parseDouble(args[2]); } } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_INVALID_COORDS); + localeManager.sendMessage(pplayer, "fixed-create-invalid-coords"); return; } } 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); + localeManager.sendMessage(pplayer, "fixed-create-out-of-range", StringPlaceholders.single("range", maxCreationDistance)); return; } ParticleEffect effect = ParticleEffect.fromName(args[3]); if (effect == null) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_EFFECT_INVALID, args[3]); + localeManager.sendMessage(pplayer, "fixed-create-effect-invalid", StringPlaceholders.single("effect", args[3])); return; - } else if (!PermissionManager.hasEffectPermission(p, effect)) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_EFFECT_NO_PERMISSION, effect.getName()); + } else if (!permissionManager.hasEffectPermission(p, effect)) { + localeManager.sendMessage(pplayer, "fixed-create-effect-no-permission", StringPlaceholders.single("effect", effect.getName())); return; } ParticleStyle style = ParticleStyle.fromName(args[4]); if (style == null) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_STYLE_INVALID, args[4]); + localeManager.sendMessage(pplayer, "fixed-create-style-invalid", StringPlaceholders.single("style", args[4])); return; - } else if (!PermissionManager.hasStylePermission(p, style)) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_STYLE_NO_PERMISSION, args[4]); + } else if (!permissionManager.hasStylePermission(p, style)) { + localeManager.sendMessage(pplayer, "fixed-create-style-no-permission", StringPlaceholders.single("style", args[4])); return; } if (!style.canBeFixed()) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_STYLE_NON_FIXABLE, style.getName()); + localeManager.sendMessage(pplayer, "fixed-create-style-non-fixable", StringPlaceholders.single("style", style.getName())); return; } @@ -201,12 +204,12 @@ public class FixedCommandModule implements CommandModule { try { note = Integer.parseInt(args[5]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-create-data-error"); return; } if (note < 0 || note > 24) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-create-data-error"); return; } @@ -225,12 +228,12 @@ public class FixedCommandModule implements CommandModule { g = Integer.parseInt(args[6]); b = Integer.parseInt(args[7]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-create-data-error"); return; } if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-create-data-error"); return; } @@ -245,7 +248,7 @@ public class FixedCommandModule implements CommandModule { if (material == null) material = Material.matchMaterial(args[5]); if (material == null || !material.isBlock()) throw new Exception(); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-create-data-error"); return; } @@ -257,7 +260,7 @@ public class FixedCommandModule implements CommandModule { if (material == null) material = Material.matchMaterial(args[5]); if (material == null || material.isBlock()) throw new Exception(); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-create-data-error"); return; } @@ -270,8 +273,8 @@ public class FixedCommandModule implements CommandModule { ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), nextFixedEffectId, effect, style, itemData, blockData, colorData, noteColorData); 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); + localeManager.sendMessage(pplayer, "fixed-create-success"); + PlayerParticles.getInstance().getManager(DataManager.class).saveFixedEffect(fixedEffect); } /** @@ -282,8 +285,11 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleEdit(PPlayer pplayer, Player p, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + if (args.length < 3) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_MISSING_ARGS); + localeManager.sendMessage(pplayer, "fixed-edit-missing-args"); return; } @@ -291,13 +297,13 @@ public class FixedCommandModule implements CommandModule { try { id = Integer.parseInt(args[0]); } catch (Exception ex) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_INVALID_ID); + localeManager.sendMessage(pplayer, "fixed-edit-invalid-id"); return; } FixedParticleEffect fixedEffect = pplayer.getFixedEffectById(id); if (fixedEffect == null) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_INVALID_ID); + localeManager.sendMessage(pplayer, "fixed-edit-invalid-id"); return; } @@ -307,10 +313,10 @@ public class FixedCommandModule implements CommandModule { double xPos, yPos, zPos; if (args[2].equalsIgnoreCase("looking")) { - Block targetBlock = p.getTargetBlock((Set) null, 8); + Block targetBlock = p.getTargetBlock((Set) null, 8); // Need the Set cast for 1.9 support int maxDistanceSqrd = 6 * 6; if (targetBlock.getLocation().distanceSquared(p.getLocation()) > maxDistanceSqrd) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_LOOKING_TOO_FAR); + localeManager.sendMessage(pplayer, "fixed-edit-looking-too-far"); return; } @@ -342,15 +348,15 @@ public class FixedCommandModule implements CommandModule { zPos = Double.parseDouble(args[4]); } } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_INVALID_COORDS); + localeManager.sendMessage(pplayer, "fixed-edit-invalid-coords"); return; } } 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); + localeManager.sendMessage(pplayer, "fixed-edit-out-of-range", StringPlaceholders.single("range", maxCreationDistance)); return; } @@ -359,10 +365,10 @@ public class FixedCommandModule implements CommandModule { case "effect": { ParticleEffect effect = ParticleEffect.fromName(args[2]); if (effect == null) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_EFFECT_INVALID, args[2]); + localeManager.sendMessage(pplayer, "fixed-edit-effect-invalid", StringPlaceholders.single("effect", args[2])); return; - } else if (!PermissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_EFFECT_NO_PERMISSION, effect.getName()); + } else if (!permissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) { + localeManager.sendMessage(pplayer, "fixed-edit-effect-no-permission", StringPlaceholders.single("effect", effect.getName())); return; } @@ -372,13 +378,13 @@ public class FixedCommandModule implements CommandModule { case "style": ParticleStyle style = ParticleStyle.fromName(args[2]); if (style == null) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_STYLE_INVALID, args[2]); + localeManager.sendMessage(pplayer, "fixed-edit-style-invalid", StringPlaceholders.single("style", args[2])); return; - } else if (!PermissionManager.hasStylePermission(pplayer.getPlayer(), style)) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_STYLE_NO_PERMISSION, style.getName()); + } else if (!permissionManager.hasStylePermission(pplayer.getPlayer(), style)) { + localeManager.sendMessage(pplayer, "fixed-edit-style-no-permission", StringPlaceholders.single("style", style.getName())); return; } else if (!style.canBeFixed()) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_STYLE_NON_FIXABLE, style.getName()); + localeManager.sendMessage(pplayer, "fixed-edit-style-non-fixable", StringPlaceholders.single("style", style.getName())); return; } @@ -402,12 +408,12 @@ public class FixedCommandModule implements CommandModule { try { note = Integer.parseInt(args[2]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-edit-data-error"); return; } if (note < 0 || note > 24) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-edit-data-error"); return; } @@ -426,12 +432,12 @@ public class FixedCommandModule implements CommandModule { g = Integer.parseInt(args[3]); b = Integer.parseInt(args[4]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-edit-data-error"); return; } if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-edit-data-error"); return; } @@ -446,7 +452,7 @@ public class FixedCommandModule implements CommandModule { if (material == null) material = Material.matchMaterial(args[2]); if (material == null || !material.isBlock()) throw new Exception(); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-edit-data-error"); return; } @@ -458,14 +464,14 @@ public class FixedCommandModule implements CommandModule { if (material == null) material = Material.matchMaterial(args[2]); if (material == null || material.isBlock()) throw new Exception(); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR); + localeManager.sendMessage(pplayer, "fixed-edit-data-error"); return; } itemData = material; } } else { - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_NONE); + localeManager.sendMessage(pplayer, "fixed-edit-data-none"); return; } @@ -476,12 +482,12 @@ public class FixedCommandModule implements CommandModule { break; } default: - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_INVALID_PROPERTY); + localeManager.sendMessage(pplayer, "fixed-edit-invalid-property"); return; } - DataManager.updateFixedEffect(fixedEffect); - LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_SUCCESS, editType, id); + PlayerParticles.getInstance().getManager(DataManager.class).updateFixedEffect(fixedEffect); + localeManager.sendMessage(pplayer, "fixed-edit-success", StringPlaceholders.builder("prop", editType).addPlaceholder("id", id).build()); } /** @@ -492,8 +498,10 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleRemove(PPlayer pplayer, Player p, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + if (args.length < 1) { - LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_NO_ARGS); + localeManager.sendMessage(pplayer, "fixed-remove-no-args"); return; } @@ -501,15 +509,15 @@ public class FixedCommandModule implements CommandModule { try { id = Integer.parseInt(args[0]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_ARGS_INVALID); + localeManager.sendMessage(pplayer, "fixed-remove-args-invalid"); return; } if (pplayer.getFixedEffectById(id) != null) { - DataManager.removeFixedEffect(pplayer.getUniqueId(), id); - LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_SUCCESS, id); + PlayerParticles.getInstance().getManager(DataManager.class).removeFixedEffect(pplayer.getUniqueId(), id); + localeManager.sendMessage(pplayer, "fixed-remove-success", StringPlaceholders.single("id", id)); } else { - LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_INVALID, id); + localeManager.sendMessage(pplayer, "fixed-remove-invalid", StringPlaceholders.single("id", id)); } } @@ -521,11 +529,13 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleList(PPlayer pplayer, Player p, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + List ids = pplayer.getFixedEffectIds(); Collections.sort(ids); if (ids.isEmpty()) { - LangManager.sendMessage(pplayer, Lang.FIXED_LIST_NONE); + localeManager.sendMessage(pplayer, "fixed-list-none"); return; } @@ -537,7 +547,7 @@ public class FixedCommandModule implements CommandModule { msg.append(id); } - LangManager.sendMessage(pplayer, Lang.FIXED_LIST_SUCCESS, msg.toString()); + localeManager.sendMessage(pplayer, "fixed-list-success", StringPlaceholders.single("ids", msg.toString())); } /** @@ -548,8 +558,10 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleInfo(PPlayer pplayer, Player p, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + if (args.length < 1) { - LangManager.sendMessage(pplayer, Lang.FIXED_INFO_NO_ARGS); + localeManager.sendMessage(pplayer, "fixed-info-no-args"); return; } @@ -557,30 +569,29 @@ public class FixedCommandModule implements CommandModule { try { id = Integer.parseInt(args[0]); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_INFO_INVALID_ARGS); + localeManager.sendMessage(pplayer, "fixed-info-invalid-args"); return; } FixedParticleEffect fixedEffect = pplayer.getFixedEffectById(id); if (fixedEffect == null) { - LangManager.sendMessage(pplayer, Lang.FIXED_INFO_INVALID, id); + localeManager.sendMessage(pplayer, "fixed-info-invalid", StringPlaceholders.single("id", id)); return; } ParticlePair particle = fixedEffect.getParticlePair(); DecimalFormat df = new DecimalFormat("0.##"); // Decimal formatter so the coords aren't super long - LangManager.sendMessage(pplayer, - Lang.FIXED_INFO_SUCCESS, - fixedEffect.getId(), - fixedEffect.getLocation().getWorld().getName(), - df.format(fixedEffect.getLocation().getX()), - df.format(fixedEffect.getLocation().getY()), - df.format(fixedEffect.getLocation().getZ()), - particle.getEffect().getName(), - particle.getStyle().getName(), - particle.getDataString() - ); + StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", fixedEffect.getId()) + .addPlaceholder("world", fixedEffect.getLocation().getWorld().getName()) + .addPlaceholder("x", df.format(fixedEffect.getLocation().getX())) + .addPlaceholder("y", df.format(fixedEffect.getLocation().getY())) + .addPlaceholder("z", df.format(fixedEffect.getLocation().getZ())) + .addPlaceholder("effect", particle.getEffect().getName()) + .addPlaceholder("style", particle.getStyle().getName()) + .addPlaceholder("data", particle.getDataString()) + .build(); + localeManager.sendMessage(pplayer, "fixed-info-success", stringPlaceholders); } /** @@ -591,13 +602,18 @@ public class FixedCommandModule implements CommandModule { * @param args The command arguments */ private void handleClear(PPlayer pplayer, Player p, String[] args) { - if (!PermissionManager.canClearFixedEffects(p)) { - LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_NO_PERMISSION); + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + 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)) { + localeManager.sendMessage(pplayer, "fixed-clear-no-permission"); return; } if (args.length < 1) { - LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_NO_ARGS); + localeManager.sendMessage(pplayer, "fixed-clear-no-args"); return; } @@ -605,24 +621,26 @@ public class FixedCommandModule implements CommandModule { try { radius = Math.abs(Integer.parseInt(args[0])); } catch (Exception e) { - LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_INVALID_ARGS); + localeManager.sendMessage(pplayer, "fixed-clear-invalid-args"); return; } 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); + localeManager.sendMessage(pplayer, "fixed-clear-success", StringPlaceholders.builder("amount", fixedEffectsToRemove.size()).addPlaceholder("range", radius).build()); } public List onTabComplete(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); Player p = pplayer.getPlayer(); List matches = new ArrayList<>(); @@ -657,9 +675,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 +735,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 +799,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..5d8965a 100644 --- a/src/main/java/dev/esophose/playerparticles/command/GUICommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/GUICommandModule.java @@ -1,42 +1,44 @@ package dev.esophose.playerparticles.command; -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.PlayerParticles; +import dev.esophose.playerparticles.manager.ConfigurationManager.Setting; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.PPlayer; +import java.util.ArrayList; +import java.util.List; public class GUICommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); + boolean byDefault = false; if (args.length > 0 && args[0].equals("_byDefault_")) { byDefault = true; } - if (GuiHandler.isGuiDisabled()) { + if (guiManager.isGuiDisabled()) { if (byDefault) { - LangManager.sendMessage(pplayer, Lang.COMMAND_ERROR_UNKNOWN); + localeManager.sendMessage(pplayer, "command-error-unknown"); } else { - LangManager.sendMessage(pplayer, Lang.GUI_DISABLED); + localeManager.sendMessage(pplayer, "gui-disabled"); } 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); + localeManager.sendMessage(pplayer, "command-error-no-effects"); } else { - LangManager.sendMessage(pplayer, Lang.COMMAND_ERROR_UNKNOWN); + localeManager.sendMessage(pplayer, "command-error-unknown"); } return; } - GuiHandler.openDefault(pplayer); + guiManager.openDefault(pplayer); } public List onTabComplete(PPlayer pplayer, String[] args) { @@ -47,8 +49,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..6418ab5 100644 --- a/src/main/java/dev/esophose/playerparticles/command/GroupCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/GroupCommandModule.java @@ -1,38 +1,39 @@ 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.LocaleManager; import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; 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 dev.esophose.playerparticles.util.StringPlaceholders; +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; public class GroupCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + List validCommands = Arrays.asList("save", "load", "remove", "info", "list"); if (args.length == 0 || !validCommands.contains(args[0])) { - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_SAVE); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_LOAD); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_REMOVE); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_INFO); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_LIST); + localeManager.sendMessage(pplayer, "command-description-group-save"); + localeManager.sendMessage(pplayer, "command-description-group-load"); + localeManager.sendMessage(pplayer, "command-description-group-remove"); + localeManager.sendMessage(pplayer, "command-description-group-info"); + localeManager.sendMessage(pplayer, "command-description-group-list"); return; } if (args.length == 1 && !args[0].equalsIgnoreCase("list")) { - LangManager.sendMessage(pplayer, Lang.GROUP_NO_NAME, args[0].toLowerCase()); + localeManager.sendMessage(pplayer, "group-no-name", StringPlaceholders.single("cmd", args[0].toLowerCase())); return; } @@ -53,11 +54,11 @@ public class GroupCommandModule implements CommandModule { this.onList(pplayer); break; default: - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_SAVE); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_LOAD); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_REMOVE); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_INFO); - LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_GROUP_LIST); + localeManager.sendMessage(pplayer, "command-description-group-save"); + localeManager.sendMessage(pplayer, "command-description-group-load"); + localeManager.sendMessage(pplayer, "command-description-group-remove"); + localeManager.sendMessage(pplayer, "command-description-group-info"); + localeManager.sendMessage(pplayer, "command-description-group-list"); break; } } @@ -69,15 +70,17 @@ public class GroupCommandModule implements CommandModule { * @param groupName The target group name */ private void onSave(PPlayer pplayer, String groupName) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + // Check that the groupName isn't the reserved name if (groupName.equalsIgnoreCase(ParticleGroup.DEFAULT_NAME)) { - LangManager.sendMessage(pplayer, Lang.GROUP_RESERVED); + localeManager.sendMessage(pplayer, "group-reserved"); return; } // Check if the player actually has any particles if (pplayer.getActiveParticles().size() == 0) { - LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_NO_PARTICLES); + localeManager.sendMessage(pplayer, "group-save-no-particles"); return; } @@ -87,8 +90,8 @@ 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)) { - LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_REACHED_MAX); + if (pplayer.getParticleGroupByName(groupName) == null && PlayerParticles.getInstance().getManager(PermissionManager.class).hasPlayerReachedMaxGroups(pplayer)) { + localeManager.sendMessage(pplayer, "group-save-reached-max"); return; } @@ -105,11 +108,11 @@ 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); + localeManager.sendMessage(pplayer, "group-save-success-overwrite", StringPlaceholders.single("name", groupName)); } else { - LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_SUCCESS, groupName); + localeManager.sendMessage(pplayer, "group-save-success", StringPlaceholders.single("name", groupName)); } } @@ -120,9 +123,11 @@ public class GroupCommandModule implements CommandModule { * @param groupName The target group name */ private void onLoad(PPlayer pplayer, String groupName) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + // Check that the groupName isn't the reserved name if (groupName.equalsIgnoreCase(ParticleGroup.DEFAULT_NAME)) { - LangManager.sendMessage(pplayer, Lang.GROUP_RESERVED); + localeManager.sendMessage(pplayer, "group-reserved"); return; } @@ -131,14 +136,14 @@ 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); + localeManager.sendMessage(pplayer, "group-invalid", StringPlaceholders.single("name", groupName)); return; } if (!presetGroup.canPlayerUse(pplayer.getPlayer())) { - LangManager.sendMessage(pplayer, Lang.GROUP_PRESET_NO_PERMISSION, groupName); + localeManager.sendMessage(pplayer, "group-preset-no-permission", StringPlaceholders.single("group", groupName)); return; } @@ -147,7 +152,7 @@ public class GroupCommandModule implements CommandModule { } if (!group.canPlayerUse(pplayer.getPlayer())) { - LangManager.sendMessage(pplayer, Lang.GROUP_NO_PERMISSION, groupName); + localeManager.sendMessage(pplayer, "group-no-permission", StringPlaceholders.single("group", groupName)); return; } @@ -158,12 +163,12 @@ 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); + localeManager.sendMessage(pplayer, "group-load-success", StringPlaceholders.builder("amount", activeGroup.getParticles().size()).addPlaceholder("name", groupName).build()); else - LangManager.sendMessage(pplayer, Lang.GROUP_LOAD_PRESET_SUCCESS, activeGroup.getParticles().size(), groupName); + localeManager.sendMessage(pplayer, "group-load-preset-success", StringPlaceholders.builder("amount", activeGroup.getParticles().size()).addPlaceholder("name", groupName).build()); } /** @@ -173,28 +178,30 @@ public class GroupCommandModule implements CommandModule { * @param groupName The target group name */ private void onRemove(PPlayer pplayer, String groupName) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + // Check that the groupName isn't the reserved name if (groupName.equalsIgnoreCase(ParticleGroup.DEFAULT_NAME)) { - LangManager.sendMessage(pplayer, Lang.GROUP_RESERVED); + localeManager.sendMessage(pplayer, "group-reserved"); return; } 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); + localeManager.sendMessage(pplayer, "group-invalid", StringPlaceholders.single("name", groupName)); } else { - LangManager.sendMessage(pplayer, Lang.GROUP_REMOVE_PRESET); + localeManager.sendMessage(pplayer, "group-remove-preset"); } return; } // Delete the group and notify player - DataManager.removeParticleGroup(pplayer.getUniqueId(), group); - LangManager.sendMessage(pplayer, Lang.GROUP_REMOVE_SUCCESS, groupName); + PlayerParticles.getInstance().getManager(DataManager.class).removeParticleGroup(pplayer.getUniqueId(), group); + localeManager.sendMessage(pplayer, "group-remove-success", StringPlaceholders.single("name", groupName)); } /** @@ -204,23 +211,25 @@ public class GroupCommandModule implements CommandModule { * @param groupName The target group name */ private void onInfo(PPlayer pplayer, String groupName) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + // Check that the groupName isn't the reserved name if (groupName.equalsIgnoreCase(ParticleGroup.DEFAULT_NAME)) { - LangManager.sendMessage(pplayer, Lang.GROUP_RESERVED); + localeManager.sendMessage(pplayer, "group-reserved"); return; } 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); + localeManager.sendMessage(pplayer, "group-invalid", StringPlaceholders.single("name", groupName)); return; } if (!presetGroup.canPlayerUse(pplayer.getPlayer())) { - LangManager.sendMessage(pplayer, Lang.GROUP_PRESET_NO_PERMISSION, groupName); + localeManager.sendMessage(pplayer, "group-preset-no-permission", StringPlaceholders.single("group", groupName)); return; } @@ -230,9 +239,15 @@ public class GroupCommandModule implements CommandModule { List particles = group.getParticles(); particles.sort(Comparator.comparingInt(ParticlePair::getId)); - LangManager.sendMessage(pplayer, Lang.GROUP_INFO_HEADER, groupName); - for (ParticlePair particle : particles) - LangManager.sendMessage(pplayer, Lang.LIST_OUTPUT, particle.getId(), particle.getEffect().getName(), particle.getStyle().getName(), particle.getDataString()); + localeManager.sendMessage(pplayer, "group-info-header", StringPlaceholders.single("group", groupName)); + for (ParticlePair particle : particles) { + StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", particle.getId()) + .addPlaceholder("effect", particle.getEffect().getName()) + .addPlaceholder("style", particle.getStyle().getName()) + .addPlaceholder("data", particle.getDataString()) + .build(); + localeManager.sendMessage(pplayer, "list-output", stringPlaceholders); + } } /** @@ -241,6 +256,8 @@ public class GroupCommandModule implements CommandModule { * @param pplayer The PPlayer */ private void onList(PPlayer pplayer) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + List groups = pplayer.getParticleGroups(); groups.sort(Comparator.comparing(ParticleGroup::getName)); @@ -254,23 +271,23 @@ 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(", ")) presetsList = new StringBuilder(presetsList.substring(0, presetsList.length() - 2)); if ((groupsList.length() == 0) && (presetsList.length() == 0)) { - LangManager.sendMessage(pplayer, Lang.GROUP_LIST_NONE); + localeManager.sendMessage(pplayer, "group-list-none"); return; } if (groupsList.length() > 0) { - LangManager.sendMessage(pplayer, Lang.GROUP_LIST_OUTPUT, groupsList.toString()); + localeManager.sendMessage(pplayer, "group-list-output", StringPlaceholders.single("info", groupsList.toString())); } if (presetsList.length() > 0) { - LangManager.sendMessage(pplayer, Lang.GROUP_LIST_PRESETS, presetsList.toString()); + localeManager.sendMessage(pplayer, "group-list-presets", StringPlaceholders.single("info", presetsList.toString())); } } @@ -290,7 +307,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 +320,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..7019be8 100644 --- a/src/main/java/dev/esophose/playerparticles/command/HelpCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/HelpCommandModule.java @@ -1,21 +1,23 @@ package dev.esophose.playerparticles.command; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.CommandManager; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.particles.PPlayer; import java.util.ArrayList; import java.util.List; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -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(); + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + + localeManager.sendMessage(pplayer, "command-descriptions"); + List cmds = PlayerParticles.getInstance().getManager(CommandManager.class).getCommands(); for (CommandModule cmd : cmds) if (!(cmd instanceof DefaultCommandModule)) CommandModule.printUsageWithDescription(pplayer, cmd); - LangManager.sendSimpleMessage(pplayer, Lang.COMMAND_DESCRIPTIONS_HELP_OTHER); + localeManager.sendSimpleMessage(pplayer, "command-descriptions-help-other"); } public List onTabComplete(PPlayer pplayer, String[] args) { @@ -26,8 +28,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..e628791 100644 --- a/src/main/java/dev/esophose/playerparticles/command/ListCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/ListCommandModule.java @@ -1,32 +1,35 @@ package dev.esophose.playerparticles.command; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.particles.PPlayer; +import dev.esophose.playerparticles.particles.ParticlePair; +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -import dev.esophose.playerparticles.particles.PPlayer; -import dev.esophose.playerparticles.particles.ParticlePair; - public class ListCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + List particles = pplayer.getActiveParticles(); particles.sort(Comparator.comparingInt(ParticlePair::getId)); if (particles.isEmpty()) { - LangManager.sendMessage(pplayer, Lang.LIST_NONE); + localeManager.sendMessage(pplayer, "list-none"); return; } - - LangManager.sendMessage(pplayer, Lang.LIST_YOU_HAVE); + + localeManager.sendMessage(pplayer, "list-you-have"); for (ParticlePair particle : particles) { - int id = particle.getId(); - String effect = particle.getEffect().getName(); - String style = particle.getStyle().getName(); - String data = particle.getDataString(); - LangManager.sendMessage(pplayer, Lang.LIST_OUTPUT, id, effect, style, data); + StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", particle.getId()) + .addPlaceholder("effect", particle.getEffect()) + .addPlaceholder("style", particle.getStyle()) + .addPlaceholder("data", particle.getDataString()) + .build(); + localeManager.sendMessage(pplayer, "list-output", stringPlaceholders); } } @@ -38,8 +41,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..9a990e9 100644 --- a/src/main/java/dev/esophose/playerparticles/command/OtherCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/OtherCommandModule.java @@ -1,56 +1,59 @@ package dev.esophose.playerparticles.command; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.CommandManager; +import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.manager.PermissionManager; +import dev.esophose.playerparticles.particles.OtherPPlayer; +import dev.esophose.playerparticles.particles.PPlayer; +import dev.esophose.playerparticles.util.StringPlaceholders; 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.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; - public class OtherCommandModule implements CommandModuleSecondary { public void onCommandExecute(CommandSender sender, String[] args) { - if (!PermissionManager.canOverride(sender)) { - LangManager.sendCommandSenderMessage(sender, Lang.OTHER_NO_PERMISSION); + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + + if (!permissionManager.canOverride(sender)) { + localeManager.sendMessage(sender, "other-no-permission"); return; } if (args.length < 2) { - LangManager.sendCommandSenderMessage(sender, Lang.OTHER_MISSING_ARGS); + localeManager.sendMessage(sender, "other-missing-args"); return; } Player other = Bukkit.getPlayer(args[0]); if (other == null) { - LangManager.sendCommandSenderMessage(sender, Lang.OTHER_UNKNOWN_PLAYER, args[0]); + localeManager.sendMessage(sender, "other-unknown-player", StringPlaceholders.single("player", args[0])); 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]); + localeManager.sendMessage(sender, "other-unknown-command", StringPlaceholders.single("cmd", args[1])); return; } - if (commandModule.requiresEffects() && PermissionManager.getEffectNamesUserHasPermissionFor(other).isEmpty()) { - LangManager.sendCommandSenderMessage(sender, Lang.OTHER_SUCCESS, other.getName()); - LangManager.sendCommandSenderMessage(sender, Lang.COMMAND_ERROR_NO_EFFECTS); + if (commandModule.requiresEffects() && permissionManager.getEffectNamesUserHasPermissionFor(other).isEmpty()) { + localeManager.sendMessage(sender, "other-success", StringPlaceholders.single("player", other.getName())); + localeManager.sendMessage(sender, "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()); + + localeManager.sendMessage(sender, "other-success", StringPlaceholders.single("player", other.getName())); String[] cmdArgs = Arrays.copyOfRange(args, 2, args.length); commandModule.onCommandExecute(otherPPlayer, cmdArgs); @@ -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..2ff85ba 100644 --- a/src/main/java/dev/esophose/playerparticles/command/ReloadCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/ReloadCommandModule.java @@ -1,23 +1,22 @@ 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.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.PPlayer; +import java.util.ArrayList; +import java.util.List; public class ReloadCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { - if (PermissionManager.canReloadPlugin(pplayer.getMessageDestination())) { - PlayerParticles.getPlugin().reload(false); - LangManager.sendMessage(pplayer, Lang.RELOAD_SUCCESS); - PlayerParticles.getPlugin().getLogger().info("Reloaded configuration."); + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + if (PlayerParticles.getInstance().getManager(PermissionManager.class).canReloadPlugin(pplayer.getMessageDestination())) { + PlayerParticles.getInstance().reload(); + localeManager.sendMessage(pplayer, "reload-success"); + PlayerParticles.getInstance().getLogger().info("Reloaded configuration."); } else { - LangManager.sendMessage(pplayer, Lang.RELOAD_NO_PERMISSION); + localeManager.sendMessage(pplayer, "reload-no-permission"); } } @@ -29,8 +28,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..e1e074e 100644 --- a/src/main/java/dev/esophose/playerparticles/command/RemoveCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/RemoveCommandModule.java @@ -1,27 +1,29 @@ package dev.esophose.playerparticles.command; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import dev.esophose.playerparticles.styles.api.ParticleStyle; -import org.apache.commons.lang.StringUtils; -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; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleEffect; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticlePair; +import dev.esophose.playerparticles.styles.ParticleStyle; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang.StringUtils; +import org.bukkit.util.StringUtil; public class RemoveCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + if (args.length == 0) { - LangManager.sendMessage(pplayer, Lang.REMOVE_NO_ARGS); + localeManager.sendMessage(pplayer, "remove-no-args"); return; } @@ -30,12 +32,12 @@ public class RemoveCommandModule implements CommandModule { try { id = Integer.parseInt(args[0]); } catch (Exception ex) { - LangManager.sendMessage(pplayer, Lang.ID_INVALID); + localeManager.sendMessage(pplayer, "id-invalid"); return; } if (id <= 0) { - LangManager.sendMessage(pplayer, Lang.ID_INVALID); + localeManager.sendMessage(pplayer, "id-invalid"); return; } @@ -50,12 +52,12 @@ public class RemoveCommandModule implements CommandModule { } if (!removed) { - LangManager.sendMessage(pplayer, Lang.ID_UNKNOWN, id); + localeManager.sendMessage(pplayer, "id-unknown", StringPlaceholders.single("id", id)); return; } - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); - LangManager.sendMessage(pplayer, Lang.REMOVE_ID_SUCCESS, id); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + localeManager.sendMessage(pplayer, "remove-id-success", StringPlaceholders.single("id", id)); } else { // Removing by effect/style name ParticleEffect effect = ParticleEffect.fromName(args[0]); ParticleStyle style = ParticleStyle.fromName(args[0]); @@ -71,10 +73,10 @@ public class RemoveCommandModule implements CommandModule { } if (removedCount > 0) { - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); - LangManager.sendMessage(pplayer, Lang.REMOVE_EFFECT_SUCCESS, removedCount, effect.getName()); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + localeManager.sendMessage(pplayer, "remove-effect-success", StringPlaceholders.builder("amount", removedCount).addPlaceholder("effect", effect.getName()).build()); } else { - LangManager.sendMessage(pplayer, Lang.REMOVE_EFFECT_NONE, effect.getName()); + localeManager.sendMessage(pplayer, "remove-effect-none", StringPlaceholders.single("effect", effect.getName())); } } else if (style != null) { int removedCount = 0; @@ -87,13 +89,13 @@ public class RemoveCommandModule implements CommandModule { } if (removedCount > 0) { - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); - LangManager.sendMessage(pplayer, Lang.REMOVE_STYLE_SUCCESS, removedCount, style.getName()); + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + localeManager.sendMessage(pplayer, "remove-style-success", StringPlaceholders.builder("amount", removedCount).addPlaceholder("style", style.getName()).build()); } else { - LangManager.sendMessage(pplayer, Lang.REMOVE_STYLE_NONE, style.getName()); + localeManager.sendMessage(pplayer, "remove-style-none", StringPlaceholders.single("style", style.getName())); } } else { - LangManager.sendMessage(pplayer, Lang.REMOVE_UNKNOWN, args[0]); + localeManager.sendMessage(pplayer, "remove-unknown", StringPlaceholders.single("name", args[0])); } } } @@ -118,8 +120,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() { @@ -127,7 +129,7 @@ public class RemoveCommandModule implements CommandModule { } public boolean requiresEffects() { - return true; + return false; } public boolean canConsoleExecute() { diff --git a/src/main/java/dev/esophose/playerparticles/command/ResetCommandModule.java b/src/main/java/dev/esophose/playerparticles/command/ResetCommandModule.java index ce67131..b300728 100644 --- a/src/main/java/dev/esophose/playerparticles/command/ResetCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/ResetCommandModule.java @@ -1,20 +1,20 @@ 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; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleGroup; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.ArrayList; +import java.util.List; public class ResetCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { int particleCount = pplayer.getActiveParticles().size(); - DataManager.saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup()); - LangManager.sendMessage(pplayer, Lang.RESET_SUCCESS, particleCount); + PlayerParticles.getInstance().getManager(DataManager.class).saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup()); + PlayerParticles.getInstance().getManager(LocaleManager.class).sendMessage(pplayer, "reset-success", StringPlaceholders.single("amount", particleCount)); } public List onTabComplete(PPlayer pplayer, String[] args) { @@ -25,8 +25,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..260cd71 100644 --- a/src/main/java/dev/esophose/playerparticles/command/StylesCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/StylesCommandModule.java @@ -1,21 +1,20 @@ package dev.esophose.playerparticles.command; -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.entity.Player; - -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.PPlayer; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.ArrayList; +import java.util.List; +import org.bukkit.entity.Player; 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(", "); @@ -25,7 +24,7 @@ public class StylesCommandModule implements CommandModule { toSend = new StringBuilder(toSend.substring(0, toSend.length() - 2)); } - LangManager.sendMessage(pplayer, Lang.STYLE_LIST, toSend.toString()); + PlayerParticles.getInstance().getManager(LocaleManager.class).sendMessage(pplayer, "style-list", StringPlaceholders.single("styles", toSend.toString())); } public List onTabComplete(PPlayer pplayer, String[] args) { @@ -36,8 +35,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..9f84482 100644 --- a/src/main/java/dev/esophose/playerparticles/command/ToggleCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/ToggleCommandModule.java @@ -1,23 +1,23 @@ package dev.esophose.playerparticles.command; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.particles.PPlayer; import java.util.ArrayList; import java.util.List; -import dev.esophose.playerparticles.manager.DataManager; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -import dev.esophose.playerparticles.particles.PPlayer; - public class ToggleCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); 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); + localeManager.sendMessage(pplayer, "toggle-off"); } else { - LangManager.sendMessage(pplayer, Lang.TOGGLE_ON); + localeManager.sendMessage(pplayer, "toggle-on"); } } @@ -29,8 +29,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..cfdd19c 100644 --- a/src/main/java/dev/esophose/playerparticles/command/VersionCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/VersionCommandModule.java @@ -1,20 +1,18 @@ package dev.esophose.playerparticles.command; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.particles.PPlayer; import java.util.ArrayList; import java.util.List; - import org.bukkit.ChatColor; -import dev.esophose.playerparticles.PlayerParticles; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -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 + "Plugin created by: " + ChatColor.AQUA + "Esophose"); + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + localeManager.sendCustomMessage(pplayer, ChatColor.YELLOW + "Running PlayerParticles " + ChatColor.AQUA + "v" + PlayerParticles.getInstance().getDescription().getVersion()); + localeManager.sendCustomMessage(pplayer, ChatColor.YELLOW + "Plugin created by: " + ChatColor.AQUA + "Esophose"); } public List onTabComplete(PPlayer pplayer, String[] args) { @@ -25,8 +23,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..259ce1a 100644 --- a/src/main/java/dev/esophose/playerparticles/command/WorldsCommandModule.java +++ b/src/main/java/dev/esophose/playerparticles/command/WorldsCommandModule.java @@ -1,28 +1,29 @@ package dev.esophose.playerparticles.command; -import java.util.ArrayList; -import java.util.List; - -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; import dev.esophose.playerparticles.particles.PPlayer; +import java.util.ArrayList; +import java.util.List; public class WorldsCommandModule implements CommandModule { public void onCommandExecute(PPlayer pplayer, String[] args) { - if (PermissionManager.getDisabledWorlds() == null || PermissionManager.getDisabledWorlds().isEmpty()) { - LangManager.sendMessage(pplayer, Lang.DISABLED_WORLDS_NONE); + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); + if (permissionManager.getDisabledWorlds() == null || permissionManager.getDisabledWorlds().isEmpty()) { + localeManager.sendMessage(pplayer, "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)); - LangManager.sendCustomMessage(pplayer, LangManager.getText(Lang.DISABLED_WORLDS) + " " + worlds); + localeManager.sendCustomMessage(pplayer, localeManager.getLocaleMessage("disabled-worlds") + " " + worlds); } public List onTabComplete(PPlayer pplayer, String[] args) { @@ -33,8 +34,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..52c4616 --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/config/CommentedConfigurationSection.java @@ -0,0 +1,393 @@ +package dev.esophose.playerparticles.config; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.bukkit.Color; +import org.bukkit.Location; +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; + +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 Location getLocation(String path) { + return this.getSerializable(path, Location.class); + } + + @Override + public Location getLocation(String path, Location def) { + return this.getSerializable(path, Location.class, def); + } + + @Override + public boolean isLocation(String path) { + return this.getSerializable(path, Location.class) != null; + } + + @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..c5c30bd --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/config/CommentedFileConfiguration.java @@ -0,0 +1,90 @@ +package dev.esophose.playerparticles.config; + +import java.io.File; +import java.io.Reader; +import java.lang.reflect.Field; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.java.JavaPlugin; +import org.yaml.snakeyaml.DumperOptions; + +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..e36c6a5 --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/config/CommentedFileConfigurationHelper.java @@ -0,0 +1,226 @@ +package dev.esophose.playerparticles.config; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.bukkit.plugin.java.JavaPlugin; + +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 = Files.newBufferedReader(Paths.get(file.getAbsolutePath()), StandardCharsets.UTF_8); + + 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 StringReader(config); + + 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 = Files.newBufferedReader(Paths.get(file.getAbsolutePath()), StandardCharsets.UTF_8); + + 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)) + && !(lastLineHadContent && !lineWasComment)) { + stringBuilder.append('\n'); + } + + stringBuilder.append(line).append('\n'); + + lastLineHadContent = lineHadContent; + lastCommentSpacing = commentSpacing; + lastLineSpacing = lineSpacing; + forceCompact = false; + } + } + + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(file.getAbsolutePath()), StandardCharsets.UTF_8)) { + writer.write(stringBuilder.toString()); + writer.flush(); + } 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..45b3985 100644 --- a/src/main/java/dev/esophose/playerparticles/database/MySqlDatabaseConnector.java +++ b/src/main/java/dev/esophose/playerparticles/database/MySQLConnector.java @@ -1,31 +1,25 @@ package dev.esophose.playerparticles.database; -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; +import java.sql.Connection; +import java.sql.SQLException; +import org.bukkit.plugin.Plugin; -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 +39,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..63cd51c --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/database/SQLiteConnector.java @@ -0,0 +1,58 @@ +package dev.esophose.playerparticles.database; + +import java.io.File; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import org.bukkit.plugin.Plugin; + +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..e814b9d --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/database/migrations/_1_InitialMigration.java @@ -0,0 +1,90 @@ +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/GuiActionButton.java b/src/main/java/dev/esophose/playerparticles/gui/GuiActionButton.java index a6f3c45..7e90486 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiActionButton.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiActionButton.java @@ -1,8 +1,10 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.gui.GuiInventoryEditData.ColorData; +import dev.esophose.playerparticles.hook.PlaceholderAPIHook; +import dev.esophose.playerparticles.particles.PPlayer; import java.util.ArrayList; import java.util.List; - import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.inventory.ItemFlag; @@ -10,8 +12,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.Dye; -import dev.esophose.playerparticles.gui.GuiInventoryEditData.ColorData; - public class GuiActionButton { private int slot; @@ -95,10 +95,11 @@ public class GuiActionButton { /** * Gets the ItemStack icon that goes into the GUI - * + * + * @param pplayer The PPlayer that is viewing the icon * @return The icon ItemStack for the GUI */ - public ItemStack getIcon() { + public ItemStack getIcon(PPlayer pplayer) { ItemStack itemStack; if (this.icons != null) { itemStack = new ItemStack(this.icons[this.iconIndex]); @@ -112,8 +113,8 @@ public class GuiActionButton { ItemMeta itemMeta = itemStack.getItemMeta(); if (itemMeta != null) { - itemMeta.setDisplayName(this.name); - itemMeta.setLore(parseLore(this.lore)); + itemMeta.setDisplayName(PlaceholderAPIHook.applyPlaceholders(pplayer.getPlayer(), this.name)); + itemMeta.setLore(parseLore(pplayer, this.lore)); itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_POTION_EFFECTS); itemStack.setItemMeta(itemMeta); } @@ -151,11 +152,12 @@ public class GuiActionButton { * Builds lore from a list of Strings * Parses \n as a new lore line * Ignores empty lore lines - * + * + * @param pplayer The PPlayer viewing the lore * @param lore The lines of lore * @return A parsed list of lore text */ - public static List parseLore(String... lore) { + public static List parseLore(PPlayer pplayer, String... lore) { List parsedLore = new ArrayList<>(); for (String line : lore) { // Try to maintain the color going to the next line if it's split @@ -169,7 +171,7 @@ public class GuiActionButton { String[] splitLines = line.split("\n"); for (String parsedLine : splitLines) { if (ChatColor.stripColor(parsedLine).isEmpty()) continue; - parsedLore.add(lineColor + parsedLine); + parsedLore.add(PlaceholderAPIHook.applyPlaceholders(pplayer.getPlayer(), lineColor + parsedLine)); } } return parsedLore; diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventory.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventory.java index d170575..c8be0fe 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventory.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventory.java @@ -1,8 +1,12 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.manager.ConfigurationManager.Setting; +import dev.esophose.playerparticles.particles.PPlayer; +import dev.esophose.playerparticles.util.ParticleUtils; import java.util.ArrayList; import java.util.List; - +import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; @@ -13,12 +17,8 @@ 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.particles.PPlayer; -import dev.esophose.playerparticles.util.ParticleUtils; - public abstract class GuiInventory implements InventoryHolder { - + protected enum BorderColor { WHITE(0, "WHITE_STAINED_GLASS_PANE"), ORANGE(1, "ORANGE_STAINED_GLASS_PANE"), @@ -124,7 +124,7 @@ public abstract class GuiInventory implements InventoryHolder { */ protected void populate() { for (GuiActionButton button : this.actionButtons) { - this.inventory.setItem(button.getSlot(), button.getIcon()); + this.inventory.setItem(button.getSlot(), button.getIcon(this.pplayer)); } } @@ -135,7 +135,7 @@ public abstract class GuiInventory implements InventoryHolder { for (GuiActionButton button : this.actionButtons) { if (button.isTickable()) { button.onTick(); - this.inventory.setItem(button.getSlot(), button.getIcon()); + this.inventory.setItem(button.getSlot(), button.getIcon(this.pplayer)); } } } @@ -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); } @@ -162,10 +162,5 @@ public abstract class GuiInventory implements InventoryHolder { } } } - - @FunctionalInterface - public interface GuiInventoryEditFinishedCallback { - void execute(); - } } diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java index 653d212..ab01d40 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java @@ -1,30 +1,35 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.ConfigurationManager.GuiIcon; import dev.esophose.playerparticles.manager.DataManager; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; import dev.esophose.playerparticles.manager.PermissionManager; -import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticlePair; import dev.esophose.playerparticles.util.ParticleUtils; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.ArrayList; +import java.util.List; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.SkullType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SkullMeta; -import java.util.ArrayList; -import java.util.List; - @SuppressWarnings("deprecation") public class GuiInventoryDefault extends GuiInventory { public GuiInventoryDefault(PPlayer pplayer) { - super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_PLAYERPARTICLES))); + super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-playerparticles"))); + + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); this.fillBorder(BorderColor.WHITE); @@ -39,15 +44,15 @@ public class GuiInventoryDefault extends GuiInventory { SkullMeta currentIconMeta = (SkullMeta) headIcon.getItemMeta(); if (currentIconMeta != null) { - currentIconMeta.setDisplayName(LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + pplayer.getPlayer().getName()); + currentIconMeta.setDisplayName(localeManager.getLocaleMessage("gui-color-icon-name") + pplayer.getPlayer().getName()); String[] currentIconLore = new String[]{ - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_ACTIVE_PARTICLES, pplayer.getActiveParticles().size()), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVED_GROUPS, pplayer.getParticleGroups().size() - 1), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_FIXED_EFFECTS, pplayer.getFixedEffectIds().size()), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-active-particles", StringPlaceholders.single("amount", pplayer.getActiveParticles().size())), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-saved-groups", StringPlaceholders.single("amount", pplayer.getParticleGroups().size() - 1)), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-fixed-effects", StringPlaceholders.single("amount", pplayer.getFixedEffectIds().size())), " ", - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_COMMANDS_INFO) + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-commands-info") }; - currentIconMeta.setLore(GuiActionButton.parseLore(currentIconLore)); + currentIconMeta.setLore(GuiActionButton.parseLore(this.pplayer, currentIconLore)); currentIconMeta.setOwner(pplayer.getPlayer().getName()); headIcon.setItemMeta(currentIconMeta); } @@ -55,8 +60,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) { @@ -77,9 +82,9 @@ public class GuiInventoryDefault extends GuiInventory { GuiActionButton manageYourParticlesButton = new GuiActionButton( manageParticlesSlot, 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))); + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-manage-your-particles"), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-manage-your-particles-description")}, + (button, isShiftClick) -> guiManager.transition(new GuiInventoryManageParticles(pplayer))); this.actionButtons.add(manageYourParticlesButton); // Manage Your Groups button @@ -87,9 +92,9 @@ public class GuiInventoryDefault extends GuiInventory { GuiActionButton manageYourGroupsButton = new GuiActionButton( manageGroupsSlot, 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))); + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-manage-your-groups"), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-manage-your-groups-description")}, + (button, isShiftClick) -> guiManager.transition(new GuiInventoryManageGroups(pplayer))); this.actionButtons.add(manageYourGroupsButton); } @@ -98,9 +103,9 @@ public class GuiInventoryDefault extends GuiInventory { GuiActionButton loadPresetGroups = new GuiActionButton( loadPresetGroupSlot, 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))); + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-load-a-preset-group"), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-load-a-preset-group-description")}, + (button, isShiftClick) -> guiManager.transition(new GuiInventoryLoadPresetGroups(pplayer, false))); this.actionButtons.add(loadPresetGroups); } @@ -112,12 +117,12 @@ public class GuiInventoryDefault extends GuiInventory { GuiActionButton editPrimaryEffect = new GuiActionButton( 38, GuiIcon.EDIT_EFFECT.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_EFFECT), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_EFFECT_DESCRIPTION)}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-edit-primary-effect"), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("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))); + List callbacks = new ArrayList<>(); + 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,36 +135,36 @@ 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(); + callbacks.get(1).run(); }); this.actionButtons.add(editPrimaryEffect); // Edit Primary Style String[] editPrimaryStyleLore; if (canEditPrimaryStyleAndData) { - editPrimaryStyleLore = new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_STYLE_DESCRIPTION)}; + editPrimaryStyleLore = new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-edit-primary-style-description")}; } else { editPrimaryStyleLore = new String[]{ - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_STYLE_DESCRIPTION), - LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_STYLE_MISSING_EFFECT) + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-edit-primary-style-description"), + localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-edit-primary-style-missing-effect") }; } GuiActionButton editPrimaryStyle = new GuiActionButton( 40, GuiIcon.EDIT_STYLE.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_STYLE), + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-edit-primary-style"), editPrimaryStyleLore, (button, isShiftClick) -> { 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))); + List callbacks = new ArrayList<>(); + 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,41 +173,41 @@ 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(); + callbacks.get(1).run(); }); this.actionButtons.add(editPrimaryStyle); // Edit Primary Data String[] editPrimaryDataLore; if (canEditPrimaryStyleAndData && doesEffectUseData) { - editPrimaryDataLore = new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_DATA_DESCRIPTION)}; + editPrimaryDataLore = new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-edit-primary-data-description")}; } else if (canEditPrimaryStyleAndData) { editPrimaryDataLore = new String[]{ - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_DATA_DESCRIPTION), - LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_DATA_UNAVAILABLE) + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-edit-primary-data-description"), + localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-edit-primary-data-unavailable") }; } else { editPrimaryDataLore = new String[]{ - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_DATA_DESCRIPTION), - LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_DATA_MISSING_EFFECT) + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-edit-primary-data-description"), + localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-edit-primary-data-missing-effect") }; } GuiActionButton editPrimaryData = new GuiActionButton( 42, GuiIcon.EDIT_DATA.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_PRIMARY_DATA), + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-edit-primary-data"), editPrimaryDataLore, (button, isShiftClick) -> { 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))); + List callbacks = new ArrayList<>(); + 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,12 +219,12 @@ 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(); + callbacks.get(1).run(); }); this.actionButtons.add(editPrimaryData); diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditData.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditData.java index 823aa99..158493d 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditData.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditData.java @@ -1,8 +1,9 @@ package dev.esophose.playerparticles.gui; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.ConfigurationManager.GuiIcon; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleEffect; import dev.esophose.playerparticles.particles.ParticleEffect.NoteColor; @@ -11,6 +12,11 @@ import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty; import dev.esophose.playerparticles.particles.ParticlePair; import dev.esophose.playerparticles.util.NMSUtil; import dev.esophose.playerparticles.util.ParticleUtils; +import dev.esophose.playerparticles.util.StringPlaceholders; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.DyeColor; @@ -18,11 +24,6 @@ import org.bukkit.Material; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - @SuppressWarnings("deprecation") public class GuiInventoryEditData extends GuiInventory { @@ -33,22 +34,22 @@ public class GuiInventoryEditData extends GuiInventory { static { colorMapping = new ColorData[]{ - new ColorData(DyeColor.RED, ParticleUtils.closestMatchWithFallback(false, "RED_DYE", "ROSE_RED"), new OrdinaryColor(255, 0, 0), Lang.GUI_EDIT_DATA_COLOR_RED), - new ColorData(DyeColor.ORANGE, ParticleUtils.closestMatchWithFallback(false, "ORANGE_DYE"), new OrdinaryColor(255, 140, 0), Lang.GUI_EDIT_DATA_COLOR_ORANGE), - new ColorData(DyeColor.YELLOW, ParticleUtils.closestMatchWithFallback(false, "YELLOW_DYE", "DANDELION_YELLOW"), new OrdinaryColor(255, 255, 0), Lang.GUI_EDIT_DATA_COLOR_YELLOW), - new ColorData(DyeColor.LIME, ParticleUtils.closestMatchWithFallback(false, "LIME_DYE"), new OrdinaryColor(50, 205, 50), Lang.GUI_EDIT_DATA_COLOR_LIME_GREEN), - new ColorData(DyeColor.GREEN, ParticleUtils.closestMatchWithFallback(false, "GREEN_DYE", "CACTUS_GREEN"), new OrdinaryColor(0, 128, 0), Lang.GUI_EDIT_DATA_COLOR_GREEN), - new ColorData(DyeColor.BLUE, ParticleUtils.closestMatchWithFallback(false, "BLUE_DYE", "LAPIS_LAZULI"), new OrdinaryColor(0, 0, 255), Lang.GUI_EDIT_DATA_COLOR_BLUE), - new ColorData(DyeColor.CYAN, ParticleUtils.closestMatchWithFallback(false, "CYAN_DYE"), new OrdinaryColor(0, 139, 139), Lang.GUI_EDIT_DATA_COLOR_CYAN), - new ColorData(DyeColor.LIGHT_BLUE, ParticleUtils.closestMatchWithFallback(false, "LIGHT_BLUE_DYE"), new OrdinaryColor(173, 216, 230), Lang.GUI_EDIT_DATA_COLOR_LIGHT_BLUE), - new ColorData(DyeColor.PURPLE, ParticleUtils.closestMatchWithFallback(false, "PURPLE_DYE"), new OrdinaryColor(138, 43, 226), Lang.GUI_EDIT_DATA_COLOR_PURPLE), - new ColorData(DyeColor.MAGENTA, ParticleUtils.closestMatchWithFallback(false, "MAGENTA_DYE"), new OrdinaryColor(202, 31, 123), Lang.GUI_EDIT_DATA_COLOR_MAGENTA), - new ColorData(DyeColor.PINK, ParticleUtils.closestMatchWithFallback(false, "PINK_DYE"), new OrdinaryColor(255, 182, 193), Lang.GUI_EDIT_DATA_COLOR_PINK), - new ColorData(DyeColor.BROWN, ParticleUtils.closestMatchWithFallback(false, "BROWN_DYE", "COCOA_BEANS"), new OrdinaryColor(139, 69, 19), Lang.GUI_EDIT_DATA_COLOR_BROWN), - new ColorData(DyeColor.BLACK, ParticleUtils.closestMatchWithFallback(false, "BLACK_DYE", "INK_SAC"), new OrdinaryColor(0, 0, 0), Lang.GUI_EDIT_DATA_COLOR_BLACK), - new ColorData(DyeColor.GRAY, ParticleUtils.closestMatchWithFallback(false, "GRAY_DYE"), new OrdinaryColor(128, 128, 128), Lang.GUI_EDIT_DATA_COLOR_GRAY), - new ColorData(DyeColor.getByDyeData((byte) 7), ParticleUtils.closestMatchWithFallback(false, "LIGHT_GRAY_DYE"), new OrdinaryColor(192, 192, 192), Lang.GUI_EDIT_DATA_COLOR_LIGHT_GRAY), - new ColorData(DyeColor.WHITE, ParticleUtils.closestMatchWithFallback(false, "WHITE_DYE", "BONE_MEAL"), new OrdinaryColor(255, 255, 255), Lang.GUI_EDIT_DATA_COLOR_WHITE), + new ColorData(DyeColor.RED, ParticleUtils.closestMatchWithFallback(false, "RED_DYE", "ROSE_RED"), new OrdinaryColor(255, 0, 0), "gui-edit-data-color-red"), + new ColorData(DyeColor.ORANGE, ParticleUtils.closestMatchWithFallback(false, "ORANGE_DYE"), new OrdinaryColor(255, 140, 0), "gui-edit-data-color-orange"), + new ColorData(DyeColor.YELLOW, ParticleUtils.closestMatchWithFallback(false, "YELLOW_DYE", "DANDELION_YELLOW"), new OrdinaryColor(255, 255, 0), "gui-edit-data-color-yellow"), + new ColorData(DyeColor.LIME, ParticleUtils.closestMatchWithFallback(false, "LIME_DYE"), new OrdinaryColor(50, 205, 50), "gui-edit-data-color-lime-green"), + new ColorData(DyeColor.GREEN, ParticleUtils.closestMatchWithFallback(false, "GREEN_DYE", "CACTUS_GREEN"), new OrdinaryColor(0, 128, 0), "gui-edit-data-color-green"), + new ColorData(DyeColor.BLUE, ParticleUtils.closestMatchWithFallback(false, "BLUE_DYE", "LAPIS_LAZULI"), new OrdinaryColor(0, 0, 255), "gui-edit-data-color-blue"), + new ColorData(DyeColor.CYAN, ParticleUtils.closestMatchWithFallback(false, "CYAN_DYE"), new OrdinaryColor(0, 139, 139), "gui-edit-data-color-cyan"), + new ColorData(DyeColor.LIGHT_BLUE, ParticleUtils.closestMatchWithFallback(false, "LIGHT_BLUE_DYE"), new OrdinaryColor(173, 216, 230), "gui-edit-data-color-light-blue"), + new ColorData(DyeColor.PURPLE, ParticleUtils.closestMatchWithFallback(false, "PURPLE_DYE"), new OrdinaryColor(138, 43, 226), "gui-edit-data-color-purple"), + new ColorData(DyeColor.MAGENTA, ParticleUtils.closestMatchWithFallback(false, "MAGENTA_DYE"), new OrdinaryColor(202, 31, 123), "gui-edit-data-color-magenta"), + new ColorData(DyeColor.PINK, ParticleUtils.closestMatchWithFallback(false, "PINK_DYE"), new OrdinaryColor(255, 182, 193), "gui-edit-data-color-pink"), + new ColorData(DyeColor.BROWN, ParticleUtils.closestMatchWithFallback(false, "BROWN_DYE", "COCOA_BEANS"), new OrdinaryColor(139, 69, 19), "gui-edit-data-color-brown"), + new ColorData(DyeColor.BLACK, ParticleUtils.closestMatchWithFallback(false, "BLACK_DYE", "INK_SAC"), new OrdinaryColor(0, 0, 0), "gui-edit-data-color-black"), + new ColorData(DyeColor.GRAY, ParticleUtils.closestMatchWithFallback(false, "GRAY_DYE"), new OrdinaryColor(128, 128, 128), "gui-edit-data-color-gray"), + new ColorData(DyeColor.getByDyeData((byte) 7), ParticleUtils.closestMatchWithFallback(false, "LIGHT_GRAY_DYE"), new OrdinaryColor(192, 192, 192), "gui-edit-data-color-light-gray"), + new ColorData(DyeColor.WHITE, ParticleUtils.closestMatchWithFallback(false, "WHITE_DYE", "BONE_MEAL"), new OrdinaryColor(255, 255, 255), "gui-edit-data-color-white"), }; rainbowColorMapping = new ColorData[]{ @@ -138,8 +139,10 @@ public class GuiInventoryEditData extends GuiInventory { } } - public GuiInventoryEditData(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { - super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_DATA))); + public GuiInventoryEditData(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-select-data"))); + + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); this.fillBorder(BorderColor.MAGENTA); @@ -162,9 +165,9 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton backButton = new GuiActionButton( INVENTORY_SIZE - 1, GuiIcon.BACK.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-back-button"), new String[]{}, - (button, isShiftClick) -> callbackList.get(callbackListPosition - 1).execute()); + (button, isShiftClick) -> callbackList.get(callbackListPosition - 1).run()); this.actionButtons.add(backButton); this.populate(); @@ -178,7 +181,9 @@ public class GuiInventoryEditData extends GuiInventory { * @param callbackList The List of GuiInventoryEditFinishedCallbacks * @param callbackListPosition The index of the callbackList we're currently at */ - private void populateColorData(ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + private void populateColorData(ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + int index = 10; int nextWrap = 17; for (ColorData colorData : colorMapping) { @@ -189,10 +194,10 @@ public class GuiInventoryEditData extends GuiInventory { index, colorData, colorData.getName(), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, formattedDisplayColor)}, + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", formattedDisplayColor))}, (button, isShiftClick) -> { editingParticle.setColor(colorData.getOrdinaryColor()); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(setColorButton); @@ -207,11 +212,11 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton setRainbowColorButton = new GuiActionButton( 39, rainbowColorMapping, - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.RAINBOW), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, LangManager.getText(Lang.RAINBOW))}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("rainbow"), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", localeManager.getLocaleMessage("rainbow")))}, (button, isShiftClick) -> { editingParticle.setColor(new OrdinaryColor(999, 999, 999)); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(setRainbowColorButton); @@ -222,11 +227,11 @@ public class GuiInventoryEditData extends GuiInventory { randomizedColors = randomizedColorsList.toArray(randomizedColors); GuiActionButton setRandomColorButton = new GuiActionButton(41, randomizedColors, - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.RANDOM), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, LangManager.getText(Lang.RANDOM))}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("random"), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", localeManager.getLocaleMessage("random")))}, (button, isShiftClick) -> { editingParticle.setColor(new OrdinaryColor(998, 998, 998)); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(setRandomColorButton); } @@ -239,7 +244,10 @@ public class GuiInventoryEditData extends GuiInventory { * @param pageNumber The current page number * @param callbackListPosition The index of the callbackList we're currently at */ - private void populateNoteData(ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + private void populateNoteData(ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); + int numberOfItems = noteColorMapping.length; int itemsPerPage = 14; int maxPages = (int) Math.ceil((double) numberOfItems / itemsPerPage); @@ -249,8 +257,8 @@ public class GuiInventoryEditData extends GuiInventory { for (int i = (pageNumber - 1) * itemsPerPage; i < numberOfItems; i++) { ColorData colorData = NMSUtil.getVersionNumber() > 13 ? noteColorMapping[i] : noteColorMappingOld[i]; - String formattedDisplayName = LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_SELECT_DATA_NOTE, i) + " (" + colorData.getName() + LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + ")"; - String formattedDescription = LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, LangManager.getText(Lang.GUI_SELECT_DATA_NOTE, i)); + String formattedDisplayName = localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-select-data-note", StringPlaceholders.single("note", i)) + " (" + colorData.getName() + localeManager.getLocaleMessage("gui-color-icon-name") + ")"; + String formattedDescription = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", localeManager.getLocaleMessage("gui-select-data-note", StringPlaceholders.single("note", i)))); // Note Color Buttons int noteIndex = i; @@ -261,7 +269,7 @@ public class GuiInventoryEditData extends GuiInventory { new String[]{formattedDescription}, (button, isShiftClick) -> { editingParticle.setNoteColor(new NoteColor(noteIndex)); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(setColorButton); @@ -277,11 +285,11 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton setRainbowColorButton = new GuiActionButton( 39, rainbowColorMapping, - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.RAINBOW), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, LangManager.getText(Lang.RAINBOW))}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("rainbow"), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", localeManager.getLocaleMessage("rainbow")))}, (button, isShiftClick) -> { editingParticle.setNoteColor(new NoteColor(99)); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(setRainbowColorButton); @@ -293,11 +301,11 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton setRandomColorButton = new GuiActionButton( 41, randomizedColors, - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.RANDOM), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, LangManager.getText(Lang.RANDOM))}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("random"), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", localeManager.getLocaleMessage("random")))}, (button, isShiftClick) -> { editingParticle.setNoteColor(new NoteColor(98)); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(setRandomColorButton); @@ -306,9 +314,9 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton previousPageButton = new GuiActionButton( INVENTORY_SIZE - 6, GuiIcon.PREVIOUS_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()), 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); } @@ -317,9 +325,9 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton nextPageButton = new GuiActionButton( INVENTORY_SIZE - 4, GuiIcon.NEXT_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()), 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); } } @@ -332,7 +340,10 @@ public class GuiInventoryEditData extends GuiInventory { * @param pageNumber The current page number * @param callbackListPosition The index of the callbackList we're currently at */ - private void populateItemData(ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + private void populateItemData(ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); + int numberOfItems = ITEM_MATERIALS.size(); int itemsPerPage = 28; int maxPages = (int) Math.ceil((double) numberOfItems / itemsPerPage); @@ -346,11 +357,11 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton setRainbowColorButton = new GuiActionButton( slot, material, - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + material.name().toLowerCase(), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, material.name().toLowerCase())}, + localeManager.getLocaleMessage("gui-color-icon-name") + material.name().toLowerCase(), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", material.name().toLowerCase()))}, (button, isShiftClick) -> { editingParticle.setItemMaterial(material); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(setRainbowColorButton); @@ -367,9 +378,9 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton previousPageButton = new GuiActionButton( INVENTORY_SIZE - 6, GuiIcon.PREVIOUS_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()), 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); } @@ -378,9 +389,9 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton nextPageButton = new GuiActionButton( INVENTORY_SIZE - 4, GuiIcon.NEXT_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()), 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); } } @@ -393,7 +404,10 @@ public class GuiInventoryEditData extends GuiInventory { * @param pageNumber The current page number * @param callbackListPosition The index of the callbackList we're currently at */ - private void populateBlockData(ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + private void populateBlockData(ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); + int numberOfItems = BLOCK_MATERIALS.size(); int itemsPerPage = 28; int maxPages = (int) Math.ceil((double) numberOfItems / itemsPerPage); @@ -407,11 +421,11 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton setRainbowColorButton = new GuiActionButton( slot, material, - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + material.name().toLowerCase(), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, material.name().toLowerCase())}, + localeManager.getLocaleMessage("gui-color-icon-name") + material.name().toLowerCase(), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", material.name().toLowerCase()))}, (button, isShiftClick) -> { editingParticle.setBlockMaterial(material); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(setRainbowColorButton); @@ -428,9 +442,9 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton previousPageButton = new GuiActionButton( INVENTORY_SIZE - 6, GuiIcon.PREVIOUS_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()), 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); } @@ -439,9 +453,9 @@ public class GuiInventoryEditData extends GuiInventory { GuiActionButton nextPageButton = new GuiActionButton( INVENTORY_SIZE - 4, GuiIcon.NEXT_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()), 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); } } @@ -453,13 +467,13 @@ public class GuiInventoryEditData extends GuiInventory { private DyeColor dyeColor; private Material material; private OrdinaryColor ordinaryColor; - private Lang name; + private String nameKey; - public ColorData(DyeColor dyeColor, Material material, OrdinaryColor ordinaryColor, Lang name) { + public ColorData(DyeColor dyeColor, Material material, OrdinaryColor ordinaryColor, String nameKey) { this.dyeColor = dyeColor; this.material = material; this.ordinaryColor = ordinaryColor; - this.name = name; + this.nameKey = nameKey; } /** @@ -495,7 +509,7 @@ public class GuiInventoryEditData extends GuiInventory { * @return The name of this color */ public String getName() { - return LangManager.getText(this.name); + return PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage(this.nameKey); } } diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditEffect.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditEffect.java index c4fea01..5f115db 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditEffect.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditEffect.java @@ -1,26 +1,30 @@ package dev.esophose.playerparticles.gui; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.ConfigurationManager.GuiIcon; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; -import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleEffect; import dev.esophose.playerparticles.particles.ParticlePair; import dev.esophose.playerparticles.util.ParticleUtils; -import org.bukkit.Bukkit; - +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.List; +import org.bukkit.Bukkit; public class GuiInventoryEditEffect extends GuiInventory { - public GuiInventoryEditEffect(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { - super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_EFFECT))); + public GuiInventoryEditEffect(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-select-effect"))); + + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); 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); @@ -33,11 +37,11 @@ public class GuiInventoryEditEffect extends GuiInventory { GuiActionButton selectButton = new GuiActionButton( slot, GuiIcon.EFFECT.get(effect.getName()), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + ParticleUtils.formatName(effect.getName()), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_EFFECT_DESCRIPTION, ParticleUtils.formatName(effect.getName()))}, + localeManager.getLocaleMessage("gui-color-icon-name") + ParticleUtils.formatName(effect.getName()), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-effect-description", StringPlaceholders.single("effect", ParticleUtils.formatName(effect.getName())))}, (button, isShiftClick) -> { editingParticle.setEffect(effect); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(selectButton); @@ -53,9 +57,9 @@ public class GuiInventoryEditEffect extends GuiInventory { GuiActionButton backButton = new GuiActionButton( INVENTORY_SIZE - 1, GuiIcon.BACK.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-back-button"), new String[]{}, - (button, isShiftClick) -> callbackList.get(callbackListPosition - 1).execute()); + (button, isShiftClick) -> callbackList.get(callbackListPosition - 1).run()); this.actionButtons.add(backButton); // Previous page button @@ -63,9 +67,9 @@ public class GuiInventoryEditEffect extends GuiInventory { GuiActionButton previousPageButton = new GuiActionButton( INVENTORY_SIZE - 6, GuiIcon.PREVIOUS_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()), 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); } @@ -74,9 +78,9 @@ public class GuiInventoryEditEffect extends GuiInventory { GuiActionButton nextPageButton = new GuiActionButton( INVENTORY_SIZE - 4, GuiIcon.NEXT_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()), 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..5523057 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditParticle.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditParticle.java @@ -1,32 +1,42 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.ConfigurationManager.GuiIcon; import dev.esophose.playerparticles.manager.DataManager; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; -import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticlePair; -import org.bukkit.Bukkit; - +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.ArrayList; import java.util.List; +import org.bukkit.Bukkit; 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()))); + super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-editing-particle", StringPlaceholders.single("id", editingParticle.getId())))); + + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); this.fillBorder(BorderColor.RED); // Particle Info Icon - String particleInfo = LangManager.getText(Lang.GUI_PARTICLE_INFO, editingParticle.getId(), editingParticle.getEffect().getName(), editingParticle.getStyle().getName(), editingParticle.getDataString()); + StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", editingParticle.getId()) + .addPlaceholder("effect", editingParticle.getEffect().getName()) + .addPlaceholder("style", editingParticle.getStyle().getName()) + .addPlaceholder("data", editingParticle.getDataString()) + .build(); + String particleInfo = localeManager.getLocaleMessage("gui-particle-info", stringPlaceholders); GuiActionButton particleInfoIcon = new GuiActionButton( 13, GuiIcon.PARTICLES.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_PARTICLE_NAME, editingParticle.getId()), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + particleInfo}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-particle-name", StringPlaceholders.single("id", editingParticle.getId())), + new String[]{localeManager.getLocaleMessage("gui-color-info") + particleInfo}, (button, isShiftClick) -> { }); this.actionButtons.add(particleInfoIcon); @@ -34,12 +44,12 @@ public class GuiInventoryEditParticle extends GuiInventory { GuiActionButton editEffectButton = new GuiActionButton( 38, GuiIcon.EDIT_EFFECT.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_EFFECT), - new String[]{LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_EDIT_EFFECT_DESCRIPTION)}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-edit-effect"), + new String[]{localeManager.getLocaleMessage("gui-color-subtext") + localeManager.getLocaleMessage("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))); + List callbacks = new ArrayList<>(); + 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,24 +58,24 @@ 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(); + callbacks.get(1).run(); }); this.actionButtons.add(editEffectButton); // Edit Style Button GuiActionButton editStyleButton = new GuiActionButton(40, GuiIcon.EDIT_STYLE.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_STYLE), - new String[]{LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_EDIT_STYLE_DESCRIPTION)}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-edit-style"), + new String[]{localeManager.getLocaleMessage("gui-color-subtext") + localeManager.getLocaleMessage("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))); + List callbacks = new ArrayList<>(); + 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,12 +84,12 @@ 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(); + callbacks.get(1).run(); }); this.actionButtons.add(editStyleButton); @@ -87,14 +97,14 @@ public class GuiInventoryEditParticle extends GuiInventory { boolean usesData = editingParticle.getEffect().hasProperty(ParticleProperty.COLORABLE) || editingParticle.getEffect().hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA); GuiActionButton editDataButton = new GuiActionButton(42, GuiIcon.EDIT_DATA.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_DATA), - usesData ? new String[]{LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_EDIT_DATA_DESCRIPTION)} : - new String[]{LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_EDIT_DATA_UNAVAILABLE)}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-edit-data"), + usesData ? new String[]{localeManager.getLocaleMessage("gui-color-subtext") + localeManager.getLocaleMessage("gui-edit-data-description")} : + new String[]{localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-edit-data-unavailable")}, (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))); + List callbacks = new ArrayList<>(); + 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,12 +116,12 @@ 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(); + callbacks.get(1).run(); } }); this.actionButtons.add(editDataButton); @@ -120,9 +130,9 @@ public class GuiInventoryEditParticle extends GuiInventory { GuiActionButton backButton = new GuiActionButton( INVENTORY_SIZE - 1, GuiIcon.BACK.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("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..20c4f2e 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditStyle.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryEditStyle.java @@ -1,26 +1,30 @@ package dev.esophose.playerparticles.gui; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.ConfigurationManager.GuiIcon; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; -import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticlePair; -import dev.esophose.playerparticles.styles.api.ParticleStyle; +import dev.esophose.playerparticles.styles.ParticleStyle; import dev.esophose.playerparticles.util.ParticleUtils; -import org.bukkit.Bukkit; - +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.List; +import org.bukkit.Bukkit; public class GuiInventoryEditStyle extends GuiInventory { - public GuiInventoryEditStyle(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { - super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_STYLE))); + public GuiInventoryEditStyle(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List callbackList, int callbackListPosition) { + super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-select-style"))); + + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); 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); @@ -33,11 +37,11 @@ public class GuiInventoryEditStyle extends GuiInventory { GuiActionButton selectButton = new GuiActionButton( slot, GuiIcon.STYLE.get(style.getName()), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + ParticleUtils.formatName(style.getName()), - new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_EFFECT_DESCRIPTION, ParticleUtils.formatName(style.getName()))}, + localeManager.getLocaleMessage("gui-color-icon-name") + ParticleUtils.formatName(style.getName()), + new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-style-description", StringPlaceholders.single("style", ParticleUtils.formatName(style.getName())))}, (button, isShiftClick) -> { editingParticle.setStyle(style); - callbackList.get(callbackListPosition + 1).execute(); + callbackList.get(callbackListPosition + 1).run(); }); this.actionButtons.add(selectButton); @@ -53,9 +57,9 @@ public class GuiInventoryEditStyle extends GuiInventory { GuiActionButton backButton = new GuiActionButton( INVENTORY_SIZE - 1, GuiIcon.BACK.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-back-button"), new String[]{}, - (button, isShiftClick) -> callbackList.get(callbackListPosition - 1).execute()); + (button, isShiftClick) -> callbackList.get(callbackListPosition - 1).run()); this.actionButtons.add(backButton); // Previous page button @@ -63,9 +67,9 @@ public class GuiInventoryEditStyle extends GuiInventory { GuiActionButton previousPageButton = new GuiActionButton( INVENTORY_SIZE - 6, GuiIcon.PREVIOUS_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()), 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); } @@ -74,9 +78,9 @@ public class GuiInventoryEditStyle extends GuiInventory { GuiActionButton nextPageButton = new GuiActionButton( INVENTORY_SIZE - 4, GuiIcon.NEXT_PAGE.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()), 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..5e4f07c 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java @@ -1,26 +1,31 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.ConfigurationManager.GuiIcon; +import dev.esophose.playerparticles.manager.ConfigurationManager.Setting; import dev.esophose.playerparticles.manager.DataManager; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.ParticleGroupPresetManager; -import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; 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 dev.esophose.playerparticles.util.ParticleUtils; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.Comparator; import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; 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))); + super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-load-a-preset-group"))); + + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); this.fillBorder(BorderColor.GREEN); @@ -29,7 +34,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; @@ -38,22 +43,30 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { particles.sort(Comparator.comparingInt(ParticlePair::getId)); String[] lore = new String[particles.size() + 1]; - lore[0] = LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_CLICK_TO_LOAD, particles.size()); + lore[0] = localeManager.getLocaleMessage("gui-color-subtext") + localeManager.getLocaleMessage("gui-click-to-load", StringPlaceholders.single("amount", particles.size())); int i = 1; for (ParticlePair particle : particles) { - lore[i] = LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PARTICLE_INFO, particle.getId(), ParticleUtils.formatName(particle.getEffect().getName()), ParticleUtils.formatName(particle.getStyle().getName()), particle.getDataString()); + StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", particle.getId()) + .addPlaceholder("effect", ParticleUtils.formatName(particle.getEffect().getName())) + .addPlaceholder("style", ParticleUtils.formatName(particle.getStyle().getName())) + .addPlaceholder("data", particle.getDataString()) + .build(); + lore[i] = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-particle-info", stringPlaceholders); i++; } // Load Group Buttons - GuiActionButton groupButton = new GuiActionButton(index, group.getGuiIcon(), LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + group.getDisplayName(), lore, (button, isShiftClick) -> { + GuiActionButton groupButton = new GuiActionButton(index, group.getGuiIcon(), localeManager.getLocaleMessage("gui-color-icon-name") + group.getDisplayName(), lore, (button, isShiftClick) -> { ParticleGroup activeGroup = pplayer.getActiveParticleGroup(); activeGroup.getParticles().clear(); - for (ParticlePair particle : particles) - activeGroup.getParticles().add(particle.clone()); - DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); + for (ParticlePair particle : particles) { + ParticlePair clonedParticle = particle.clone(); + clonedParticle.setOwner(pplayer); + activeGroup.getParticles().add(clonedParticle); + } + dataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup); - if (PSetting.GUI_CLOSE_AFTER_GROUP_SELECTED.getBoolean()) { + if (Setting.GUI_CLOSE_AFTER_GROUP_SELECTED.getBoolean()) { pplayer.getPlayer().closeInventory(); } }); @@ -71,20 +84,20 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { // Back Button GuiActionButton backButton = new GuiActionButton( INVENTORY_SIZE - 1, GuiIcon.BACK.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("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 GuiActionButton resetParticles = new GuiActionButton( 49, GuiIcon.RESET.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_RESET_PARTICLES), - new String[]{LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_RESET_PARTICLES_DESCRIPTION)}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-reset-particles"), + new String[]{localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("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..6c4a1db 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java @@ -1,27 +1,32 @@ 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.ConfigurationManager.GuiIcon; +import dev.esophose.playerparticles.manager.ConfigurationManager.Setting; import dev.esophose.playerparticles.manager.DataManager; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; -import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; -import dev.esophose.playerparticles.manager.SettingManager.PSetting; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticlePair; import dev.esophose.playerparticles.util.ParticleUtils; -import org.bukkit.Bukkit; - +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import org.bukkit.Bukkit; public class GuiInventoryManageGroups extends GuiInventory { public GuiInventoryManageGroups(PPlayer pplayer) { - super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_MANAGE_YOUR_GROUPS))); + super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-manage-your-groups"))); + + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); this.fillBorder(BorderColor.BROWN); @@ -38,23 +43,28 @@ public class GuiInventoryManageGroups extends GuiInventory { particles.sort(Comparator.comparingInt(ParticlePair::getId)); String[] lore = new String[particles.size() + 2]; - lore[0] = LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_CLICK_TO_LOAD, particles.size()); + lore[0] = localeManager.getLocaleMessage("gui-color-subtext") + localeManager.getLocaleMessage("gui-click-to-load", StringPlaceholders.single("amount", particles.size())); int i = 1; for (ParticlePair particle : particles) { - lore[i] = LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PARTICLE_INFO, particle.getId(), ParticleUtils.formatName(particle.getEffect().getName()), ParticleUtils.formatName(particle.getStyle().getName()), particle.getDataString()); + StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", particle.getId()) + .addPlaceholder("effect", ParticleUtils.formatName(particle.getEffect().getName())) + .addPlaceholder("style", ParticleUtils.formatName(particle.getStyle().getName())) + .addPlaceholder("data", particle.getDataString()) + .build(); + lore[i] = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-particle-info", stringPlaceholders); i++; } - lore[i] = LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_SHIFT_CLICK_TO_DELETE); + lore[i] = localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-shift-click-to-delete"); // Load Group Buttons GuiActionButton groupButton = new GuiActionButton( index, GuiIcon.GROUPS.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + group.getName(), + localeManager.getLocaleMessage("gui-color-icon-name") + group.getName(), 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 +73,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,41 +90,41 @@ 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) { lore = new String[]{ - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVE_GROUP_DESCRIPTION), - LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_SAVE_GROUP_FULL) + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-save-group-description"), + localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-save-group-full") }; } else if (!hasParticles) { lore = new String[]{ - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVE_GROUP_DESCRIPTION), - LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_SAVE_GROUP_NO_PARTICLES) + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-save-group-description"), + localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-save-group-no-particles") }; } else { - lore = new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVE_GROUP_DESCRIPTION)}; + lore = new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-save-group-description")}; } // Save Group Button GuiActionButton saveGroupButton = new GuiActionButton( 40, GuiIcon.CREATE.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_SAVE_GROUP), + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-save-group"), lore, (button, isShiftClick) -> { if (hasReachedMax || !hasParticles) return; 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]; // Check that the groupName isn't the reserved name if (groupName.equalsIgnoreCase(ParticleGroup.DEFAULT_NAME)) { - LangManager.sendMessage(pplayer, Lang.GROUP_RESERVED); + localeManager.sendMessage(pplayer, "group-reserved"); return; } @@ -136,14 +146,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); + localeManager.sendMessage(pplayer, "group-save-success-overwrite", StringPlaceholders.single("name", groupName)); } else { - LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_SUCCESS, groupName); + localeManager.sendMessage(pplayer, "group-save-success", StringPlaceholders.single("name", groupName)); } - GuiHandler.transition(new GuiInventoryManageGroups(pplayer)); + guiManager.transition(new GuiInventoryManageGroups(pplayer)); } })); pplayer.getPlayer().closeInventory(); @@ -154,9 +164,9 @@ public class GuiInventoryManageGroups extends GuiInventory { GuiActionButton backButton = new GuiActionButton( INVENTORY_SIZE - 1, GuiIcon.BACK.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("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..d5c60ec 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageParticles.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageParticles.java @@ -1,25 +1,30 @@ package dev.esophose.playerparticles.gui; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.ConfigurationManager.GuiIcon; import dev.esophose.playerparticles.manager.DataManager; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; +import dev.esophose.playerparticles.manager.GuiManager; +import dev.esophose.playerparticles.manager.LocaleManager; import dev.esophose.playerparticles.manager.PermissionManager; -import dev.esophose.playerparticles.manager.SettingManager.GuiIcon; import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty; import dev.esophose.playerparticles.particles.ParticleGroup; import dev.esophose.playerparticles.particles.ParticlePair; import dev.esophose.playerparticles.util.ParticleUtils; -import org.bukkit.Bukkit; - +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import org.bukkit.Bukkit; public class GuiInventoryManageParticles extends GuiInventory { public GuiInventoryManageParticles(PPlayer pplayer) { - super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_MANAGE_YOUR_PARTICLES))); + super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-manage-your-particles"))); + + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); + DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); + GuiManager guiManager = PlayerParticles.getInstance().getManager(GuiManager.class); this.fillBorder(BorderColor.ORANGE); @@ -31,18 +36,23 @@ public class GuiInventoryManageParticles extends GuiInventory { int nextWrap = 17; int maxIndex = 35; for (ParticlePair particle : particles) { + StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", particle.getId()) + .addPlaceholder("effect", ParticleUtils.formatName(particle.getEffect().getName())) + .addPlaceholder("style", ParticleUtils.formatName(particle.getStyle().getName())) + .addPlaceholder("data", particle.getDataString()) + .build(); GuiActionButton selectButton = new GuiActionButton( index, GuiIcon.PARTICLES.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_PARTICLE_NAME, particle.getId()), + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-particle-name", StringPlaceholders.single("id", particle.getId())), new String[]{ - LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_CLICK_TO_EDIT_PARTICLE, particles.size()), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PARTICLE_INFO, particle.getId(), ParticleUtils.formatName(particle.getEffect().getName()), ParticleUtils.formatName(particle.getStyle().getName()), particle.getDataString()), - LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_SHIFT_CLICK_TO_DELETE) + localeManager.getLocaleMessage("gui-color-subtext") + localeManager.getLocaleMessage("gui-click-to-edit-particle"), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-particle-info", stringPlaceholders), + localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-shift-click-to-delete") }, (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 +62,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,51 +80,51 @@ public class GuiInventoryManageParticles extends GuiInventory { } // Create New Particle Button - boolean canCreate = pplayer.getActiveParticles().size() < PermissionManager.getMaxParticlesAllowed(pplayer.getPlayer()); - String lore = LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_CREATE_PARTICLE_DESCRIPTION); + boolean canCreate = pplayer.getActiveParticles().size() < PlayerParticles.getInstance().getManager(PermissionManager.class).getMaxParticlesAllowed(pplayer.getPlayer()); + String lore = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-create-particle-description"); GuiActionButton createNewParticle = new GuiActionButton( 38, GuiIcon.CREATE.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_CREATE_PARTICLE), - canCreate ? new String[]{lore} : new String[]{lore, LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_CREATE_PARTICLE_UNAVAILABLE)}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-create-particle"), + canCreate ? new String[]{lore} : new String[]{lore, localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-create-particle-unavailable")}, (button, isShiftClick) -> { 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))); + List callbacks = new ArrayList<>(); + 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(); + callbacks.get(4).run(); } }); callbacks.add(() -> { // 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(); + callbacks.get(1).run(); }); this.actionButtons.add(createNewParticle); // Reset Particles Button GuiActionButton resetParticles = new GuiActionButton(42, GuiIcon.RESET.get(), - LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_RESET_PARTICLES), - new String[]{LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_RESET_PARTICLES_DESCRIPTION)}, + localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-reset-particles"), + new String[]{localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("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); @@ -122,9 +132,9 @@ public class GuiInventoryManageParticles extends GuiInventory { GuiActionButton backButton = new GuiActionButton( INVENTORY_SIZE - 1, GuiIcon.BACK.get(), - LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("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..9161887 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHook.java +++ b/src/main/java/dev/esophose/playerparticles/gui/hook/PlayerChatHook.java @@ -1,9 +1,13 @@ package dev.esophose.playerparticles.gui.hook; +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.manager.LocaleManager; +import dev.esophose.playerparticles.util.NMSUtil; +import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.HashSet; import java.util.Set; - -import dev.esophose.playerparticles.util.NMSUtil; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -12,13 +16,6 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; -import dev.esophose.playerparticles.PlayerParticles; -import dev.esophose.playerparticles.manager.LangManager; -import dev.esophose.playerparticles.manager.LangManager.Lang; - -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; - public class PlayerChatHook extends BukkitRunnable implements Listener { private static Set hooks; @@ -31,7 +28,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 +42,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; } } @@ -69,11 +66,12 @@ public class PlayerChatHook extends BukkitRunnable implements Listener { if (player == null) { hooksToRemove.remove(hook); } else { + LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); if (NMSUtil.getVersionNumber() == 9) { if (hook.getMaxHookLength() == hook.getTimeRemaining()) - player.sendMessage(LangManager.getText(Lang.GUI_SAVE_GROUP_HOTBAR_MESSAGE, hook.getTimeRemaining())); + player.sendMessage(localeManager.getLocaleMessage("gui-save-group-hotbar-message", StringPlaceholders.single("seconds", hook.getTimeRemaining()))); } else { - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(LangManager.getText(Lang.GUI_SAVE_GROUP_HOTBAR_MESSAGE, hook.getTimeRemaining()))); + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(localeManager.getLocaleMessage("gui-save-group-hotbar-message", StringPlaceholders.single("seconds", hook.getTimeRemaining())))); } } } 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/hook/PlaceholderAPIHook.java b/src/main/java/dev/esophose/playerparticles/hook/PlaceholderAPIHook.java new file mode 100644 index 0000000..9d72298 --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/hook/PlaceholderAPIHook.java @@ -0,0 +1,33 @@ +package dev.esophose.playerparticles.hook; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import me.clip.placeholderapi.PlaceholderAPI; + +public final class PlaceholderAPIHook { + + private static Boolean enabled; + + /** + * @return true if PlaceholderAPI is enabled, otherwise false + */ + public static boolean enabled() { + if (enabled != null) + return enabled; + return enabled = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; + } + + /** + * Applies placeholders from PlaceholderAPI to strings + * + * @param player The Player to apply placeholders with + * @param text The text to replace placeholders + * @return A string with replaced placeholders + */ + public static String applyPlaceholders(Player player, String text) { + if (enabled()) + return PlaceholderAPI.setPlaceholders(player, text); + return text; + } + +} 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..979c652 --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/locale/EnglishLocale.java @@ -0,0 +1,327 @@ +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() {{ + this.put("#0", "Plugin Message Prefix"); + this.put("prefix", "&7[&3PlayerParticles&7] "); + + this.put("#1", "Command Description Messages"); + 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."); + this.put("command-descriptions", "&eThe following commands are available:"); + this.put("command-descriptions-usage", "&e/pp %cmd% %args%"); + this.put("command-descriptions-help-1", "&7> &b/pp %cmd% &e- %desc%"); + this.put("command-descriptions-help-2", "&7> &b/pp %cmd% %args% &e- %desc%"); + 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"); + + this.put("#2", "Fixed Particle Command Description Messages"); + this.put("command-description-fixed-create", "&e/pp fixed create < |>