diff --git a/changelog.txt b/changelog.txt index 99be84f..f4b6cf8 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,18 @@ == UPDATING WILL DELETE YOUR CONFIG.YML == * Create a backup of your config.yml if you wish to import all your old settings! +=== v5.2 === +* Added native support for Minecraft 1.13.x +* Still compatible with Minecraft 1.9 through Minecraft 1.12! +* Renamed a bunch of effects to their internal names, you will have to update your user permissions +* All saved player data on file and in the database (if enabled) will be deleted, it isn't backwards compatible with PlayerParticles v5.1 due to "the flattening" +* Permission checks are now only performed on command execution for efficiency +* Block/Item data in the GUI are now randomized +* Removed the 'data' tag from block/item data, it was removed in 1.13 +* Added full tab-completion support +* Added all new 1.13 particle effects +* Alphabatized effects and styles in their respective info lists +* Fixed /pp data throwing an internal error on rare occasions +* Removed excessive console logging when database-enable is set to true === v5.1 === * Fix bug preventing the use of /pp effect, style, data, and reset from being used before a player has opened the GUI * Empty messages in config.yml will no longer display an error to the player, they won't be printed out at all diff --git a/pom.xml b/pom.xml index 822af24..cb5bda2 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ 3.1.0 + 1.13 package shade @@ -53,7 +54,115 @@ - C:\Users\Esophose\Desktop\Spigot 1.13 Dev Server\plugins\update\PlayerParticles v5.2.jar + C:\Users\Esophose\Desktop\Spigot Dev Servers\1.13\plugins\update\PlayerParticles v5.2.jar + + + + 1.12 + package + + shade + + + + + com.zaxxer:HikariCP + org.slf4j:slf4j-api + org.slf4j:slf4j-nop + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + C:\Users\Esophose\Desktop\Spigot Dev Servers\1.12\plugins\update\PlayerParticles v5.2.jar + + + + 1.11 + package + + shade + + + + + com.zaxxer:HikariCP + org.slf4j:slf4j-api + org.slf4j:slf4j-nop + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + C:\Users\Esophose\Desktop\Spigot Dev Servers\1.11\plugins\update\PlayerParticles v5.2.jar + + + + 1.10 + package + + shade + + + + + com.zaxxer:HikariCP + org.slf4j:slf4j-api + org.slf4j:slf4j-nop + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + C:\Users\Esophose\Desktop\Spigot Dev Servers\1.10\plugins\update\PlayerParticles v5.2.jar + + + + 1.9 + package + + shade + + + + + com.zaxxer:HikariCP + org.slf4j:slf4j-api + org.slf4j:slf4j-nop + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + C:\Users\Esophose\Desktop\Spigot Dev Servers\1.9\plugins\update\PlayerParticles v5.2.jar diff --git a/src/com/esophose/playerparticles/ParticleCommandCompleter.java b/src/com/esophose/playerparticles/ParticleCommandCompleter.java index e532391..234e5eb 100644 --- a/src/com/esophose/playerparticles/ParticleCommandCompleter.java +++ b/src/com/esophose/playerparticles/ParticleCommandCompleter.java @@ -65,7 +65,7 @@ public class ParticleCommandCompleter implements TabCompleter { } } else if (args[0].equalsIgnoreCase("data")) { PPlayer pplayer = PPlayerDataManager.getInstance().getPPlayer(((Player) sender).getUniqueId()); - if (pplayer == null && args.length == 2) { + if (pplayer == null) { completions.add(ChatColor.stripColor(MessageType.NO_DATA_USAGE.getMessage())); } else if (pplayer.getParticleEffect().hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA) && args.length == 2) { if (pplayer.getParticleEffect() == ParticleEffect.ITEM) { diff --git a/src/com/esophose/playerparticles/PlayerParticles.java b/src/com/esophose/playerparticles/PlayerParticles.java index 1026cf4..77051e8 100644 --- a/src/com/esophose/playerparticles/PlayerParticles.java +++ b/src/com/esophose/playerparticles/PlayerParticles.java @@ -76,10 +76,37 @@ public class PlayerParticles extends JavaPlugin { Bukkit.getPluginManager().registerEvents(new PlayerParticlesGui(), this); double configVersion = getConfig().getDouble("version"); if (configVersion < Double.parseDouble(getDescription().getVersion())) { + // Make sure database information gets carried over between config updates + boolean databaseEnable = false; + String databaseHostname = ""; + int databasePort = 3306; + String databaseName = ""; + String databaseUserName = ""; + String databaseUserPassword = ""; + File configFile = new File(getDataFolder(), "config.yml"); - if (configFile.exists()) configFile.delete(); + if (configFile.exists()) { + databaseEnable = getConfig().getBoolean("database-enable"); + databaseHostname = getConfig().getString("database-hostname"); + databasePort = getConfig().getInt("database-port"); + databaseName = getConfig().getString("database-name"); + databaseUserName = getConfig().getString("database-user-name"); + databaseUserPassword = getConfig().getString("database-user-password"); + if (databaseEnable) { // @formatter:off + getLogger().warning("== WARNING == The PlayerParticles database configuration was detected as database-enable=true. " + + "The database configuration has been loaded this time for critical schema updates, but has also been DELETED from the config.yml! " + + "This needs to be replaced or else the plugin wont connect to the database on its next load!"); // @formatter:on + } + configFile.delete(); + } saveDefaultConfig(); reloadConfig(); + getConfig().set("database-enable", databaseEnable); + getConfig().set("database-hostname", databaseHostname); + getConfig().set("database-port", databasePort); + getConfig().set("database-name", databaseName); + getConfig().set("database-user-name", databaseUserName); + getConfig().set("database-user-password", databaseUserPassword); getLogger().warning("The config.yml has been updated to v" + getDescription().getVersion() + "!"); } @@ -153,7 +180,7 @@ public class PlayerParticles extends JavaPlugin { private void checkDatabase(boolean shouldPurge) { if (getConfig().getBoolean("database-enable")) { mySQL = new DatabaseManager(getConfig()); - + useMySQL = mySQL.isInitialized(); // If something goes wrong, this will be set to false if (!useMySQL) return; // Break out, couldn't set up the database connection @@ -167,7 +194,6 @@ public class PlayerParticles extends JavaPlugin { statement.addBatch("DROP TABLE pp_data_block"); statement.addBatch("DROP TABLE pp_data_color"); statement.addBatch("DROP TABLE pp_data_note"); - statement.executeBatch(); } catch (SQLException e) { getLogger().info("Failed to connect to the MySQL Database! Check to see if your login information is correct!"); getLogger().info("Additional information: " + e.getMessage()); diff --git a/src/com/esophose/playerparticles/gui/ColorData.java b/src/com/esophose/playerparticles/gui/ColorData.java index 5f59923..79e9203 100644 --- a/src/com/esophose/playerparticles/gui/ColorData.java +++ b/src/com/esophose/playerparticles/gui/ColorData.java @@ -18,18 +18,38 @@ public class ColorData { this.name = name; } + /** + * Get the DyeColor + * + * @return The DyeColor + */ public DyeColor getDyeColor() { return this.dyeColor; } + /** + * Get the Material representing this color + * + * @return The Material + */ public Material getMaterial() { return this.material; } + /** + * Get the OrdinaryColor representing this color + * + * @return The OrdinaryColor + */ public OrdinaryColor getOrdinaryColor() { return this.ordinaryColor; } + /** + * Get the name of this color + * + * @return The name of this color + */ public String getName() { return this.name; } diff --git a/src/com/esophose/playerparticles/gui/PlayerParticlesGui.java b/src/com/esophose/playerparticles/gui/PlayerParticlesGui.java index 9e2844b..1dbd927 100644 --- a/src/com/esophose/playerparticles/gui/PlayerParticlesGui.java +++ b/src/com/esophose/playerparticles/gui/PlayerParticlesGui.java @@ -13,6 +13,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.UUID; import org.bukkit.Bukkit; @@ -20,6 +21,7 @@ import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.DyeColor; import org.bukkit.Material; +import org.bukkit.Particle; import org.bukkit.SkullType; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.enchantments.Enchantment; @@ -93,12 +95,13 @@ public class PlayerParticlesGui extends BukkitRunnable implements Listener { */ private static DyeColor[] rainbowColors; private static int rainbowColorsIndex = 0; - + /** - * 28 of each block/item Materials for block/item data + * Cached material data */ - private static Material[] blockMaterials; - private static Material[] itemMaterials; + private static final Random RANDOM = new Random(); + private static List BLOCK_MATERIALS = new ArrayList(); + private static List ITEM_MATERIALS = new ArrayList(); static { // @formatter:off colorMapping = new ColorData[] { @@ -116,7 +119,7 @@ public class PlayerParticlesGui extends BukkitRunnable implements Listener { new ColorData(DyeColor.BROWN, ParticleUtils.closestMatch("COCOA_BEANS"), new OrdinaryColor(139, 69, 19), ChatColor.GOLD + "brown"), new ColorData(DyeColor.BLACK, ParticleUtils.closestMatch("INK_SAC"), new OrdinaryColor(0, 0, 0), ChatColor.DARK_GRAY + "black"), new ColorData(DyeColor.GRAY, ParticleUtils.closestMatch("GRAY_DYE"), new OrdinaryColor(128, 128, 128), ChatColor.DARK_GRAY + "gray"), - new ColorData(DyeColor.getByColor(Color.SILVER), ParticleUtils.closestMatch("LIGHT_GRAY_DYE"), new OrdinaryColor(192, 192, 192), ChatColor.GRAY + "light gray"), + new ColorData(DyeColor.getByDyeData((byte)7), ParticleUtils.closestMatch("LIGHT_GRAY_DYE"), new OrdinaryColor(192, 192, 192), ChatColor.GRAY + "light gray"), new ColorData(DyeColor.WHITE, ParticleUtils.closestMatch("BONE_MEAL"), new OrdinaryColor(255, 255, 255), ChatColor.WHITE + "white"), }; @@ -130,68 +133,20 @@ public class PlayerParticlesGui extends BukkitRunnable implements Listener { DyeColor.PURPLE }; - // All materials contain their > 1.13 name, followed by their legacy name, if applicable - blockMaterials = new Material[] { - ParticleUtils.closestMatchWithFallback("STONE"), - ParticleUtils.closestMatchWithFallback("GRASS"), - ParticleUtils.closestMatchWithFallback("TNT"), - ParticleUtils.closestMatchWithFallback("COBBLESTONE"), - ParticleUtils.closestMatchWithFallback("OAK_WOOD", "WOOD"), - ParticleUtils.closestMatchWithFallback("BEDROCK"), - ParticleUtils.closestMatchWithFallback("SAND"), - ParticleUtils.closestMatchWithFallback("OAK_LOG", "LOG"), - ParticleUtils.closestMatchWithFallback("SPONGE"), - ParticleUtils.closestMatchWithFallback("GLASS"), - ParticleUtils.closestMatchWithFallback("WHITE_WOOL", "WOOL"), - ParticleUtils.closestMatchWithFallback("IRON_BLOCK"), - ParticleUtils.closestMatchWithFallback("GOLD_BLOCK"), - ParticleUtils.closestMatchWithFallback("DIAMOND_BLOCK"), - ParticleUtils.closestMatchWithFallback("EMERALD_BLOCK"), - ParticleUtils.closestMatchWithFallback("COAL_BLOCK"), - ParticleUtils.closestMatchWithFallback("REDSTONE_BLOCK"), - ParticleUtils.closestMatchWithFallback("BOOKSHELF"), - ParticleUtils.closestMatchWithFallback("ICE"), - ParticleUtils.closestMatchWithFallback("CLAY"), - ParticleUtils.closestMatchWithFallback("PUMPKIN"), - ParticleUtils.closestMatchWithFallback("MELON", "MELON_BLOCK"), - ParticleUtils.closestMatchWithFallback("NETHERRACK"), - ParticleUtils.closestMatchWithFallback("SOUL_SAND"), - ParticleUtils.closestMatchWithFallback("GLOWSTONE"), - ParticleUtils.closestMatchWithFallback("NETHER_BRICKS"), - ParticleUtils.closestMatchWithFallback("END_STONE", "ENDER_STONE"), - ParticleUtils.closestMatchWithFallback("PRISMARINE") - }; - - itemMaterials = new Material[] { - ParticleUtils.closestMatchWithFallback("COAL"), - ParticleUtils.closestMatchWithFallback("IRON_INGOT"), - ParticleUtils.closestMatchWithFallback("GOLD_INGOT"), - ParticleUtils.closestMatchWithFallback("REDSTONE"), - ParticleUtils.closestMatchWithFallback("EMERALD"), - ParticleUtils.closestMatchWithFallback("QUARTZ"), - ParticleUtils.closestMatchWithFallback("BRICK", "CLAY_BRICK"), - ParticleUtils.closestMatchWithFallback("GLOWSTONE_DUST"), - ParticleUtils.closestMatchWithFallback("SUGAR_CANE"), - ParticleUtils.closestMatchWithFallback("FLINT"), - ParticleUtils.closestMatchWithFallback("POTATO", "POTATO_ITEM"), - ParticleUtils.closestMatchWithFallback("CARROT", "CARROT_ITEM"), - ParticleUtils.closestMatchWithFallback("SNOWBALL", "SNOW_BALL"), - ParticleUtils.closestMatchWithFallback("BONE"), - ParticleUtils.closestMatchWithFallback("ENDER_PEARL"), - ParticleUtils.closestMatchWithFallback("BLAZE_POWDER"), - ParticleUtils.closestMatchWithFallback("NETHER_WART", "NETHER_STALK"), - ParticleUtils.closestMatchWithFallback("FIRE_CHARGE", "FIREBALL"), - ParticleUtils.closestMatchWithFallback("CHORUS_FRUIT"), - ParticleUtils.closestMatchWithFallback("PRISMARINE_CRYSTALS"), - ParticleUtils.closestMatchWithFallback("GUNPOWDER", "SULPHUR"), - ParticleUtils.closestMatchWithFallback("APPLE"), - ParticleUtils.closestMatchWithFallback("MELON"), - ParticleUtils.closestMatchWithFallback("COOKIE"), - ParticleUtils.closestMatchWithFallback("IRON_SHOVEL", "IRON_SPADE"), - ParticleUtils.closestMatchWithFallback("COMPASS"), - ParticleUtils.closestMatchWithFallback("CLOCK", "WATCH"), - ParticleUtils.closestMatchWithFallback("NAME_TAG") - }; + Inventory testingInventory = Bukkit.createInventory(null, 9); + for (Material mat : Material.values()) { + // Verify an ItemStack of the material can be placed into an inventory. In 1.12 and up this can easily be checked with mat.isItem(), but that doesn't exist pre 1.12 + testingInventory.clear(); + testingInventory.setItem(0, new ItemStack(mat, 1)); + ItemStack itemStack = testingInventory.getItem(0); + if (itemStack != null) { + if (mat.isBlock()) { + BLOCK_MATERIALS.add(mat); + } else if (!mat.isBlock()) { + ITEM_MATERIALS.add(mat); + } + } + } } // @formatter:on /** @@ -207,23 +162,28 @@ public class PlayerParticlesGui extends BukkitRunnable implements Listener { effectIcons = new HashMap(); styleIcons = new HashMap(); - defaultMenuIcons[0] = ParticleUtils.closestMatch(config.getString("gui-icon.main-menu.EFFECT")); - defaultMenuIcons[1] = ParticleUtils.closestMatch(config.getString("gui-icon.main-menu.STYLE")); - defaultMenuIcons[2] = ParticleUtils.closestMatch(config.getString("gui-icon.main-menu.DATA")); - for (int i = 0; i < defaultMenuIcons.length; i++) - if (defaultMenuIcons[i] == null) defaultMenuIcons[i] = Material.BARRIER; + defaultMenuIcons[0] = ParticleUtils.closestMatchWithFallback(config.getString("gui-icon.main-menu.EFFECT")); + defaultMenuIcons[1] = ParticleUtils.closestMatchWithFallback(config.getString("gui-icon.main-menu.STYLE")); + defaultMenuIcons[2] = ParticleUtils.closestMatchWithFallback(config.getString("gui-icon.main-menu.DATA")); + + // Grab a different effect icon set based on if the Minecraft version is >= 1.13 or not + String legacy; + try { + Particle.valueOf("NAUTILUS"); + legacy = ""; + } catch (Exception ex) { + legacy = "-legacy"; + } for (ParticleEffect effect : ParticleEffect.getSupportedEffects()) { - String effectName = effect.name(); - Material iconMaterial = ParticleUtils.closestMatch(config.getString("gui-icon.effect." + effectName)); - if (iconMaterial == null) iconMaterial = Material.BARRIER; // Missing icon or invalid? Replace it with a barrier instead to fail safety. + String effectName = effect.getName().toUpperCase(); + Material iconMaterial = ParticleUtils.closestMatchWithFallback(config.getString("gui-icon.effect" + legacy + "." + effectName)); effectIcons.put(effectName, iconMaterial); } for (ParticleStyle style : ParticleStyleManager.getStyles()) { String styleName = style.getName().toUpperCase(); - Material iconMaterial = ParticleUtils.closestMatch(config.getString("gui-icon.style." + styleName)); - if (iconMaterial == null) iconMaterial = Material.BARRIER; // Missing icon or invalid? Replace it with a barrier instead to fail safety. + Material iconMaterial = ParticleUtils.closestMatchWithFallback(config.getString("gui-icon.style" + legacy + "." + styleName)); styleIcons.put(styleName, iconMaterial); } @@ -373,6 +333,7 @@ public class PlayerParticlesGui extends BukkitRunnable implements Listener { currentIconLore[2] = ChatColor.YELLOW + "Active Data: " + ChatColor.AQUA + p.getParticleDataString(); currentIconMeta.setLore(Arrays.asList(currentIconLore)); currentIconMeta.setOwner(player.getName()); + //currentIconMeta.setOwningPlayer(Bukkit.getOfflinePlayer(player.getUniqueId())); // This doesn't exist in 1.9 currentIcon.setItemMeta(currentIconMeta); ItemStack effectIcon = new ItemStack(defaultMenuIcons[0], 1); @@ -510,43 +471,58 @@ public class PlayerParticlesGui extends BukkitRunnable implements Listener { inventory.setItem(40, getItemForRainbowColorData(p.getColorData(), rainbowColors[rainbowColorsIndex])); } } else if (pe.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) { + List materialBag = new ArrayList(); + int materialIndex = 0; + if (pe == ParticleEffect.ITEM) { // Item data Material currentItemMaterial = p.getItemData().getMaterial(); - int itemMaterialIndex = 0; + + while (materialBag.size() < 28) { // Grab 28 random materials that are an item + Material randomMaterial = ITEM_MATERIALS.get(RANDOM.nextInt(ITEM_MATERIALS.size())); + if (!materialBag.contains(randomMaterial)) + materialBag.add(randomMaterial); + } + for (int i = 10; i <= 16; i++) { // Top row - inventory.setItem(i, getItemForMaterialData(currentItemMaterial, "item", itemMaterials[itemMaterialIndex])); - itemMaterialIndex++; + inventory.setItem(i, getItemForMaterialData(currentItemMaterial, "item", materialBag.get(materialIndex))); + materialIndex++; } for (int i = 19; i <= 25; i++) { // Middle 1 row - inventory.setItem(i, getItemForMaterialData(currentItemMaterial, "item", itemMaterials[itemMaterialIndex])); - itemMaterialIndex++; + inventory.setItem(i, getItemForMaterialData(currentItemMaterial, "item", materialBag.get(materialIndex))); + materialIndex++; } for (int i = 28; i <= 34; i++) { // Middle 2 row - inventory.setItem(i, getItemForMaterialData(currentItemMaterial, "item", itemMaterials[itemMaterialIndex])); - itemMaterialIndex++; + inventory.setItem(i, getItemForMaterialData(currentItemMaterial, "item", materialBag.get(materialIndex))); + materialIndex++; } for (int i = 37; i <= 43; i++) { // Bottom row - inventory.setItem(i, getItemForMaterialData(currentItemMaterial, "item", itemMaterials[itemMaterialIndex])); - itemMaterialIndex++; + inventory.setItem(i, getItemForMaterialData(currentItemMaterial, "item", materialBag.get(materialIndex))); + materialIndex++; } } else { // Block data Material currentBlockMaterial = p.getBlockData().getMaterial(); - int blockMaterialIndex = 0; + + while (materialBag.size() < 28) { // Grab 28 random materials that are an item + Material randomMaterial = BLOCK_MATERIALS.get(RANDOM.nextInt(BLOCK_MATERIALS.size())); + if (!materialBag.contains(randomMaterial)) + materialBag.add(randomMaterial); + } + for (int i = 10; i <= 16; i++) { // Top row - inventory.setItem(i, getItemForMaterialData(currentBlockMaterial, "block", blockMaterials[blockMaterialIndex])); - blockMaterialIndex++; + inventory.setItem(i, getItemForMaterialData(currentBlockMaterial, "block", materialBag.get(materialIndex))); + materialIndex++; } for (int i = 19; i <= 25; i++) { // Middle 1 row - inventory.setItem(i, getItemForMaterialData(currentBlockMaterial, "block", blockMaterials[blockMaterialIndex])); - blockMaterialIndex++; + inventory.setItem(i, getItemForMaterialData(currentBlockMaterial, "block", materialBag.get(materialIndex))); + materialIndex++; } for (int i = 28; i <= 34; i++) { // Middle 2 row - inventory.setItem(i, getItemForMaterialData(currentBlockMaterial, "block", blockMaterials[blockMaterialIndex])); - blockMaterialIndex++; + inventory.setItem(i, getItemForMaterialData(currentBlockMaterial, "block", materialBag.get(materialIndex))); + materialIndex++; } for (int i = 37; i <= 43; i++) { // Bottom row - inventory.setItem(i, getItemForMaterialData(currentBlockMaterial, "block", blockMaterials[blockMaterialIndex])); - blockMaterialIndex++; + inventory.setItem(i, getItemForMaterialData(currentBlockMaterial, "block", materialBag.get(materialIndex))); + materialIndex++; } } } diff --git a/src/com/esophose/playerparticles/particles/ParticleEffect.java b/src/com/esophose/playerparticles/particles/ParticleEffect.java index 9d9bf30..1538a4a 100644 --- a/src/com/esophose/playerparticles/particles/ParticleEffect.java +++ b/src/com/esophose/playerparticles/particles/ParticleEffect.java @@ -39,7 +39,7 @@ public enum ParticleEffect { BARRIER("BARRIER", "BARRIER"), BLOCK("BLOCK_CRACK", "BLOCK_CRACK", ParticleProperty.REQUIRES_MATERIAL_DATA), BUBBLE("WATER_BUBBLE", "WATER_BUBBLE"), - //BUBBLE_COLUMN_UP("BUBBLE_COLUMN_UP", null), // Identical to bubble + BUBBLE_COLUMN_UP("BUBBLE_COLUMN_UP", null), BUBBLE_POP("BUBBLE_POP", null), CLOUD("CLOUD", "CLOUD"), CRIT("CRIT", "CRIT"), @@ -56,6 +56,7 @@ public enum ParticleEffect { END_ROD("END_ROD", "END_ROD"), ENTITY_EFFECT("SPELL_MOB", "SPELL_MOB", ParticleProperty.COLORABLE), EXPLOSION("EXPLOSION_LARGE", "EXPLOSION_LARGE"), + EXPLOSION_EMITTER("EXPLOSION_HUGE", "EXPLOSION_HUGE"), FALLING_DUST("FALLING_DUST", "FALLING_DUST", ParticleProperty.REQUIRES_MATERIAL_DATA), FIREWORK("FIREWORKS_SPARK", "FIREWORKS_SPARK"), FISHING("WATER_WAKE", "WATER_WAKE"), @@ -63,7 +64,6 @@ public enum ParticleEffect { FOOTSTEP(null, "FOOTSTEP"), // Removed in Minecraft 1.13 :( HAPPY_VILLAGER("VILLAGER_HAPPY", "VILLAGER_HAPPY"), HEART("HEART", "HEART"), - EXPLOSION_EMITTER("EXPLOSION_HUGE", "EXPLOSION_HUGE"), INSTANT_EFFECT("SPELL_INSTANT", "SPELL_INSTANT"), ITEM("ITEM_CRACK", "ITEM_CRACK", ParticleProperty.REQUIRES_MATERIAL_DATA), ITEM_SLIME("SLIME", "SLIME"), @@ -90,12 +90,13 @@ public enum ParticleEffect { private static final int PARTICLE_DISPLAY_RANGE_SQUARED = 36864; // (12 chunks * 16 blocks per chunk)^2 private static final Map NAME_MAP = new HashMap(); private static boolean VERSION_13; // This is a particle unique to Minecraft 1.13, this is a reliable way of telling what server version is running - private static Constructor DUSTOPTIONS_CONSTRUCTOR; - private static Method CREATEBLOCKDATA_METHOD; + private static Constructor DustOptions_CONSTRUCTOR; + private static Method createBlockData_METHOD; private final Particle internalEnum; private final List properties; // Initialize map for quick name and id lookup + // Initialize Minecraft 1.13 related variables static { for (ParticleEffect effect : values()) { NAME_MAP.put(effect.getName(), effect); @@ -103,10 +104,11 @@ public enum ParticleEffect { try { VERSION_13 = Particle.valueOf("NAUTILUS") != null; - DUSTOPTIONS_CONSTRUCTOR = Particle.REDSTONE.getDataType().getConstructor(Color.class, float.class); - CREATEBLOCKDATA_METHOD = Material.class.getMethod("createBlockData"); + DustOptions_CONSTRUCTOR = Particle.REDSTONE.getDataType().getConstructor(Color.class, float.class); + createBlockData_METHOD = Material.class.getMethod("createBlockData"); } catch (Exception e) { - DUSTOPTIONS_CONSTRUCTOR = null; + DustOptions_CONSTRUCTOR = null; + createBlockData_METHOD = null; VERSION_13 = false; } } @@ -259,7 +261,7 @@ public enum ParticleEffect { OrdinaryColor dustColor = (OrdinaryColor)color; Object dustData = null; try { // The DustData class doesn't exist in Minecraft versions less than 1.13... so this is disgusting... but it works great - dustData = DUSTOPTIONS_CONSTRUCTOR.newInstance(Color.fromRGB(dustColor.getRed(), dustColor.getGreen(), dustColor.getBlue()), 1); // Wait, you can change the size of these now??? AWESOME! I might implement this in the future! + dustData = DustOptions_CONSTRUCTOR.newInstance(Color.fromRGB(dustColor.getRed(), dustColor.getGreen(), dustColor.getBlue()), 1); // Wait, you can change the size of these now??? AWESOME! I might implement this in the future! } catch (Exception e) { } for (Player player : getPlayersInRange(center)) { @@ -297,7 +299,7 @@ public enum ParticleEffect { Object extraData = null; if (internalEnum.getDataType().getTypeName().equals("org.bukkit.block.data.BlockData")) { try { // The Material.createBlockData() method doesn't exist in Minecraft versions less than 1.13... so this is disgusting... but it works great - extraData = CREATEBLOCKDATA_METHOD.invoke(data.getMaterial()); + extraData = createBlockData_METHOD.invoke(data.getMaterial()); } catch (Exception e) { } } else if (internalEnum.getDataType() == ItemStack.class) { extraData = new ItemStack(data.getMaterial()); @@ -350,8 +352,7 @@ public enum ParticleEffect { /** * Represents the particle data for effects like - * {@link ParticleEffect#ITEM}, {@link ParticleEffect#BLOCK_CRACK}, - * {@link ParticleEffect#BLOCK_DUST}, and {@link ParticleEffect#FALLING_DUST} + * {@link ParticleEffect#ITEM}, {@link ParticleEffect#BLOCK}, and {@link ParticleEffect#FALLING_DUST} *

* This class is part of the ParticleEffect Library and follows the * same usage conditions @@ -382,7 +383,7 @@ public enum ParticleEffect { } /** - * Represents the item data for the {@link ParticleEffect#ITEM_CRACK} effect + * Represents the item data for the {@link ParticleEffect#ITEM} effect *

* This class is part of the ParticleEffect Library and follows the * same usage conditions @@ -402,8 +403,8 @@ public enum ParticleEffect { } /** - * Represents the block data for the {@link ParticleEffect#BLOCK_CRACK} and - * {@link ParticleEffect#BLOCK_DUST} effects + * Represents the block data for the {@link ParticleEffect#BLOCK} and + * {@link ParticleEffect#FALLING_DUST} effects *

* This class is part of the ParticleEffect Library and follows the * same usage conditions @@ -416,7 +417,6 @@ public enum ParticleEffect { * Construct a new block data * * @param material Material of the block - * @param data Data value of the block * @throws IllegalArgumentException If the material is not a block */ public BlockData(Material material) throws IllegalArgumentException { @@ -428,8 +428,8 @@ public enum ParticleEffect { } /** - * Represents the color for effects like {@link ParticleEffect#MOB_SPELL}, - * {@link ParticleEffect#MOB_SPELL_AMBIENT}, {@link ParticleEffect#RED_DUST} + * Represents the color for effects like {@link ParticleEffect#ENTITY_EFFECT}, + * {@link ParticleEffect#AMBIENT_ENTITY_EFFECT}, {@link ParticleEffect#DUST} * and {@link ParticleEffect#NOTE} *

* This class is part of the ParticleEffect Library and follows the @@ -462,8 +462,8 @@ public enum ParticleEffect { } /** - * Represents the color for effects like {@link ParticleEffect#MOB_SPELL}, - * {@link ParticleEffect#MOB_SPELL_AMBIENT} and {@link ParticleEffect#NOTE} + * Represents the color for effects like {@link ParticleEffect#ENTITY_EFFECT}, + * {@link ParticleEffect#AMBIENT_ENTITY_EFFECT} and {@link ParticleEffect#NOTE} *

* This class is part of the ParticleEffect Library and follows the * same usage conditions diff --git a/src/com/esophose/playerparticles/styles/DefaultStyles.java b/src/com/esophose/playerparticles/styles/DefaultStyles.java index 0a69637..98d5fc0 100644 --- a/src/com/esophose/playerparticles/styles/DefaultStyles.java +++ b/src/com/esophose/playerparticles/styles/DefaultStyles.java @@ -14,61 +14,62 @@ public class DefaultStyles { /** * All the styles that are available by default from this plugin */ - public static final ParticleStyle NONE = new ParticleStyleNone(); - public static final ParticleStyle BEAM = new ParticleStyleBeam(); - public static final ParticleStyle HALO = new ParticleStyleHalo(); - public static final ParticleStyle POINT = new ParticleStylePoint(); - public static final ParticleStyle MOVE = new ParticleStyleMove(); - public static final ParticleStyle SPIN = new ParticleStyleSpin(); - public static final ParticleStyle QUADHELIX = new ParticleStyleQuadhelix(); - public static final ParticleStyle ORBIT = new ParticleStyleOrbit(); - public static final ParticleStyle FEET = new ParticleStyleFeet(); - public static final ParticleStyle CUBE = new ParticleStyleCube(); public static final ParticleStyle ARROWS = new ParticleStyleArrows(); - public static final ParticleStyle SPIRAL = new ParticleStyleSpiral(); - public static final ParticleStyle THICK = new ParticleStyleThick(); - public static final ParticleStyle WINGS = new ParticleStyleWings(); - public static final ParticleStyle SPHERE = new ParticleStyleSphere(); - public static final ParticleStyle SWORDS = new ParticleStyleSwords(); - public static final ParticleStyle HURT = new ParticleStyleHurt(); - public static final ParticleStyle BLOCKPLACE = new ParticleStyleBlockPlace(); + public static final ParticleStyle BEAM = new ParticleStyleBeam(); public static final ParticleStyle BLOCKBREAK = new ParticleStyleBlockBreak(); public static final ParticleStyle BLOCKEDIT = new ParticleStyleBlockEdit(); + public static final ParticleStyle BLOCKPLACE = new ParticleStyleBlockPlace(); + public static final ParticleStyle CUBE = new ParticleStyleCube(); + public static final ParticleStyle FEET = new ParticleStyleFeet(); + public static final ParticleStyle HALO = new ParticleStyleHalo(); + public static final ParticleStyle HURT = new ParticleStyleHurt(); + public static final ParticleStyle MOVE = new ParticleStyleMove(); + public static final ParticleStyle NONE = new ParticleStyleNone(); + public static final ParticleStyle ORBIT = new ParticleStyleOrbit(); + public static final ParticleStyle POINT = new ParticleStylePoint(); + public static final ParticleStyle QUADHELIX = new ParticleStyleQuadhelix(); + public static final ParticleStyle SPHERE = new ParticleStyleSphere(); + public static final ParticleStyle SPIN = new ParticleStyleSpin(); + public static final ParticleStyle SPIRAL = new ParticleStyleSpiral(); + public static final ParticleStyle SWORDS = new ParticleStyleSwords(); + public static final ParticleStyle THICK = new ParticleStyleThick(); + public static final ParticleStyle WINGS = new ParticleStyleWings(); /** * Registers all the default styles to the ParticleStyleManager + * Registered in alphabetical order */ public static void registerStyles() { - ParticleStyleManager.registerStyle(NONE); - ParticleStyleManager.registerStyle(BEAM); - ParticleStyleManager.registerStyle(HALO); - ParticleStyleManager.registerStyle(POINT); - ParticleStyleManager.registerCustomHandledStyle(MOVE); - ParticleStyleManager.registerStyle(SPIN); - ParticleStyleManager.registerStyle(QUADHELIX); - ParticleStyleManager.registerStyle(ORBIT); - ParticleStyleManager.registerStyle(FEET); - ParticleStyleManager.registerStyle(CUBE); ParticleStyleManager.registerStyle(ARROWS); - ParticleStyleManager.registerStyle(SPIRAL); - ParticleStyleManager.registerStyle(THICK); - ParticleStyleManager.registerStyle(WINGS); - ParticleStyleManager.registerStyle(SPHERE); - ParticleStyleManager.registerCustomHandledStyle(SWORDS); - ParticleStyleManager.registerCustomHandledStyle(HURT); - ParticleStyleManager.registerCustomHandledStyle(BLOCKPLACE); + ParticleStyleManager.registerStyle(BEAM); ParticleStyleManager.registerCustomHandledStyle(BLOCKBREAK); ParticleStyleManager.registerCustomHandledStyle(BLOCKEDIT); + ParticleStyleManager.registerCustomHandledStyle(BLOCKPLACE); + ParticleStyleManager.registerStyle(CUBE); + ParticleStyleManager.registerStyle(FEET); + ParticleStyleManager.registerStyle(HALO); + ParticleStyleManager.registerCustomHandledStyle(HURT); + ParticleStyleManager.registerCustomHandledStyle(MOVE); + ParticleStyleManager.registerStyle(NONE); + ParticleStyleManager.registerStyle(ORBIT); + ParticleStyleManager.registerStyle(POINT); + ParticleStyleManager.registerStyle(QUADHELIX); + ParticleStyleManager.registerStyle(SPHERE); + ParticleStyleManager.registerStyle(SPIN); + ParticleStyleManager.registerStyle(SPIRAL); + ParticleStyleManager.registerCustomHandledStyle(SWORDS); + ParticleStyleManager.registerStyle(THICK); + ParticleStyleManager.registerStyle(WINGS); PluginManager manager = Bukkit.getPluginManager(); Plugin playerParticles = PlayerParticles.getPlugin(); - manager.registerEvents((Listener) MOVE, playerParticles); manager.registerEvents((Listener) ARROWS, playerParticles); - manager.registerEvents((Listener) SWORDS, playerParticles); - manager.registerEvents((Listener) HURT, playerParticles); - manager.registerEvents((Listener) BLOCKPLACE, playerParticles); manager.registerEvents((Listener) BLOCKBREAK, playerParticles); + manager.registerEvents((Listener) BLOCKPLACE, playerParticles); manager.registerEvents((Listener) BLOCKEDIT, playerParticles); + manager.registerEvents((Listener) HURT, playerParticles); + manager.registerEvents((Listener) MOVE, playerParticles); + manager.registerEvents((Listener) SWORDS, playerParticles); } } diff --git a/src/config.yml b/src/config.yml index 1288c3f..09d1c95 100644 --- a/src/config.yml +++ b/src/config.yml @@ -488,75 +488,145 @@ gui-icon: EFFECT: BLAZE_POWDER STYLE: NETHER_STAR DATA: BOOK - effect: - NONE: THIN_GLASS - EXPLODE: SULPHUR - LARGE_EXPLODE: FIREBALL - HUGE_EXPLOSION: TNT - FIREWORKS_SPARK: FIREWORK - BUBBLE: GLASS - WAKE: BOAT - SUSPENDED: WATER_LILY - DEPTH_SUSPEND: BEDROCK - CRIT: IRON_SWORD - MAGIC_CRIT: NETHER_STALK - SMOKE: TORCH - LARGE_SMOKE: WEB - SPELL: GLASS_BOTTLE - INSTANT_SPELL: POTION - MOB_SPELL: GLOWSTONE_DUST - MOB_SPELL_AMBIENT: BEACON - WITCH_MAGIC: CAULDRON_ITEM - DRIP_WATER: WATER_BUCKET - DRIP_LAVA: LAVA_BUCKET + effect: # 1.13 and up + AMBIENT_ENTITY_EFFECT: BEACON ANGRY_VILLAGER: IRON_DOOR - HAPPY_VILLAGER: WOOD_DOOR - NOTE: NOTE_BLOCK - PORTAL: OBSIDIAN - ENCHANTMENT_TABLE: ENCHANTMENT_TABLE - FLAME: BLAZE_POWDER - LAVA: MAGMA_CREAM - FOOTSTEP: GRASS - CLOUD: WOOL - RED_DUST: REDSTONE - SNOWBALL_POOF: SNOW_BALL - SNOW_SHOVEL: SNOW - SLIME: SLIME_BALL - HEART: RED_ROSE BARRIER: BARRIER - ITEM_CRACK: STICK - BLOCK_CRACK: DEAD_BUSH - BLOCK_DUST: SOUL_SAND - DROPLET: LAPIS_ORE - DRAGON_BREATH: DRAGONS_BREATH - END_ROD: END_ROD + BLOCK: STONE + BUBBLE: BUBBLE_CORAL + BUBBLE_COLUMN_UP: MAGMA_BLOCK + BUBBLE_POP: BUBBLE_CORAL_FAN + CLOUD: WHITE_WOOL + CRIT: IRON_SWORD + CURRENT_DOWN: SOUL_SAND DAMAGE_INDICATOR: BOW - SWEEP_ATTACK: GOLD_SWORD + DOLPHIN: DOLPHIN_SPAWN_EGG + DRAGON_BREATH: DRAGON_BREATH + DRIPPING_LAVA: LAVA_BUCKET + DRIPPING_WATER: WATER_BUCKET + DUST: REDSTONE + ENCHANT: ENCHANTING_TABLE + ENCHANTED_HIT: DIAMOND_SWORD + END_ROD: END_ROD + ENTITY_EFFECT: GLOWSTONE_DUST + EXPLOSION: FIRE_CHARGE + EXPLOSION_EMITTER: TNT FALLING_DUST: SAND - TOTEM: TOTEM - SPIT: PUMPKIN_SEEDS - style: + FIREWORK: FIREWORK_ROCKET + FISHING: FISHING_ROD + FLAME: BLAZE_POWDER + HAPPY_VILLAGER: DARK_OAK_DOOR + HEART: POPPY + INSTANT_EFFECT: SPLASH_POTION + ITEM: ITEM_FRAME + ITEM_SLIME: SLIME_BALL + ITEM_SNOWBALL: SNOWBALL + LARGE_SMOKE: COBWEB + LAVA: MAGMA_CREAM + MYCELIUM: MYCELIUM + NAUTILUS: HEART_OF_THE_SEA + NONE: GLASS_PANE + NOTE: NOTE_BLOCK + POOF: FIREWORK_STAR + PORTAL: OBSIDIAN + RAIN: PUFFERFISH_BUCKET + SMOKE: TORCH + SPELL: POTION + SPIT: LLAMA_SPAWN_EGG + SPLASH: SALMON + SQUID_INK: INK_SAC + SWEEP_ATTACK: GOLDEN_SWORD + TOTEM_OF_UNDYING: TOTEM + UNDERWATER: TURTLE_HELMET + WITCH: CAULDRON + effect-legacy: # 1.9 to 1.12 + AMBIENT_ENTITY_EFFECT: BEACON + ANGRY_VILLAGER: IRON_DOOR + BARRIER: BARRIER + BLOCK: STONE + BUBBLE: GLASS + CLOUD: WOOL + CRIT: IRON_SWORD + DAMAGE_INDICATOR: BOW + DRAGON_BREATH: DRAGONS_BREATH + DRIPPING_LAVA: LAVA_BUCKET + DRIPPING_WATER: WATER_BUCKET + DUST: REDSTONE + ENCHANT: ENCHANTMENT_TABLE + ENCHANTED_HIT: DIAMOND_SWORD + END_ROD: END_ROD + ENTITY_EFFECT: GLOWSTONE_DUST + EXPLOSION: FIREBALL + EXPLOSION_EMITTER: TNT + FALLING_DUST: SAND + FIREWORK: FIREWORK + FISHING: FISHING_ROD + FLAME: BLAZE_POWDER + FOOTSTEP: GRASS + HAPPY_VILLAGER: WOOD_DOOR + HEART: RED_ROSE + INSTANT_EFFECT: POTION + ITEM: ITEM_FRAME + ITEM_SLIME: SLIME_BALL + ITEM_SNOWBALL: SNOWBALL + LARGE_SMOKE: WEB + LAVA: MAGMA_CREAM + MYCELIUM: MYCEL NONE: THIN_GLASS - BEAM: POWERED_RAIL - HALO: ENDER_PORTAL_FRAME - POINT: STONE_BUTTON - MOVE: PISTON_BASE - SPIN: BEACON - QUADHELIX: ACTIVATOR_RAIL - ORBIT: ENCHANTMENT_TABLE - FEET: GRASS - CUBE: STONE + NOTE: NOTE_BLOCK + POOF: FIREWORK_CHARGE + PORTAL: OBSIDIAN + RAIN: LAPIS_BLOCK + SMOKE: TORCH + SPELL: GLASS_BOTTLE + SPIT: PUMPKIN_SEEDS + SPLASH: FISH + SWEEP_ATTACK: GOLD_SWORD + TOTEM_OF_UNDYING: TOTEM + UNDERWATER: BOAT + WITCH: CAULDRON + style: # 1.13 and up ARROWS: BOW - SPIRAL: HOPPER - THICK: VINE - WINGS: ELYTRA - SPHERE: SNOW_BALL - SWORDS: IRON_SWORD - HURT: CACTUS - BLOCKPLACE: WOOD + BEAM: POWERED_RAIL BLOCKBREAK: IRON_PICKAXE BLOCKEDIT: DISPENSER - + BLOCKPLACE: OAK_PLANKS + CUBE: STONE + FEET: GRASS + HALO: ENDER_PORTAL_FRAME + HURT: CACTUS + MOVE: PISTON + NONE: GLASS_PANE + ORBIT: ENCHANTING_TABLE + POINT: STONE_BUTTON + QUADHELIX: NAUTILUS_SHELL + SPHERE: HEART_OF_THE_SEA + SPIN: BEACON + SPIRAL: HOPPER + SWORDS: IRON_SWORD + THICK: COBWEB + WINGS: ELYTRA + style-legacy: # 1.9 to 1.12 + ARROWS: BOW + BEAM: POWERED_RAIL + BLOCKBREAK: IRON_PICKAXE + BLOCKEDIT: DISPENSER + BLOCKPLACE: WOOD + CUBE: STONE + FEET: GRASS + HALO: ENDER_PORTAL_FRAME + HURT: CACTUS + MOVE: PISTON_BASE + NONE: THIN_GLASS + ORBIT: ENCHANTMENT_TABLE + POINT: STONE_BUTTON + QUADHELIX: ACTIVATOR_RAIL + SPHERE: SNOW_BALL + SPIN: BEACON + SPIRAL: HOPPER + SWORDS: IRON_SWORD + THICK: VINE + WINGS: ELYTRA # That's everything! You reached the end of the configuration. # Enjoy the plugin! \ No newline at end of file