From 022a4efee29e576e9eeb52845bc583749a93acc6 Mon Sep 17 00:00:00 2001 From: Esophose Date: Tue, 25 Apr 2017 21:19:51 -0600 Subject: [PATCH] v4.3.1 Fix Update This update should fix some problems with too many players' data being stored --- changelog.txt | 4 ++ .../playerparticles/FixedParticleEffect.java | 2 +- src/com/esophose/playerparticles/PPlayer.java | 11 +++ .../playerparticles/PlayerParticles.java | 1 + .../manager/ConfigManager.java | 66 ++++++++++------- .../manager/ParticleManager.java | 70 +++++++++---------- .../playerparticles/styles/DefaultStyles.java | 26 +++---- .../styles/ParticleStyleMove.java | 2 +- 8 files changed, 106 insertions(+), 76 deletions(-) diff --git a/changelog.txt b/changelog.txt index 90798c3..2d2b463 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,9 @@ == UPDATING WILL DELETE YOUR CONFIG.YML == * Create a backup of your config.yml if you wish to import all your old settings! +=== v4.3.1 === + * Fix players with the permission playerparticles.* being able to force reset other player's particles when they weren't supposed to be able to + * Fix players being saved in the config/database even if they haven't used the plugin + * Other internal changes & optimizations === v4.3 === * Fix effects and styles not defaulting to 'none' if the player no longer has permission * Fix errors printing to console resulting from offline players trying to spawn particles diff --git a/src/com/esophose/playerparticles/FixedParticleEffect.java b/src/com/esophose/playerparticles/FixedParticleEffect.java index a510910..596984f 100644 --- a/src/com/esophose/playerparticles/FixedParticleEffect.java +++ b/src/com/esophose/playerparticles/FixedParticleEffect.java @@ -87,7 +87,7 @@ public class FixedParticleEffect { this.particleColorData = colorData; this.particleNoteColorData = noteColorData; - PPlayer owner = ConfigManager.getInstance().getPPlayer(this.pplayerUUID, false); + PPlayer owner = ConfigManager.getInstance().getPPlayer(this.pplayerUUID, true); // Check nulls, if any are null set them to the PPlayer's values if (this.particleItemData == null) this.particleItemData = owner.getItemData(); diff --git a/src/com/esophose/playerparticles/PPlayer.java b/src/com/esophose/playerparticles/PPlayer.java index 2d14cdd..08c47a4 100644 --- a/src/com/esophose/playerparticles/PPlayer.java +++ b/src/com/esophose/playerparticles/PPlayer.java @@ -10,7 +10,9 @@ package com.esophose.playerparticles; import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.entity.Player; import com.esophose.playerparticles.library.ParticleEffect; import com.esophose.playerparticles.library.ParticleEffect.BlockData; @@ -74,6 +76,15 @@ public class PPlayer { public UUID getUniqueId() { return this.playerUUID; } + + /** + * Gets the Player from their UUID + * + * @return The player if they are online, null if they are offline + */ + public Player getPlayer() { + return Bukkit.getPlayer(this.playerUUID); + } /** * Gets the player's particle effect diff --git a/src/com/esophose/playerparticles/PlayerParticles.java b/src/com/esophose/playerparticles/PlayerParticles.java index adb8374..d859eb1 100644 --- a/src/com/esophose/playerparticles/PlayerParticles.java +++ b/src/com/esophose/playerparticles/PlayerParticles.java @@ -10,6 +10,7 @@ TODO: v4.4 + Add new style 'tornado' + Add new style 'atom' + + Add new style 'wings' + GUI for styles and effects - Requires no additional permissions /pp gui - Shows GUI that tells you your current effect, style, and data and lets you choose new ones /pp gui effect - Shows GUI that lets you select a new effect, also shows your current one diff --git a/src/com/esophose/playerparticles/manager/ConfigManager.java b/src/com/esophose/playerparticles/manager/ConfigManager.java index e0a0c9c..7697ed2 100644 --- a/src/com/esophose/playerparticles/manager/ConfigManager.java +++ b/src/com/esophose/playerparticles/manager/ConfigManager.java @@ -77,19 +77,21 @@ public class ConfigManager { * @param fileName The name of the file */ private ConfigManager(String fileName) { - if (!PlayerParticles.getPlugin().getDataFolder().exists()) PlayerParticles.getPlugin().getDataFolder().mkdir(); + if (!PlayerParticles.useMySQL) { // Don't bother creating the playerData.yml file if we aren't going to use it + if (!PlayerParticles.getPlugin().getDataFolder().exists()) PlayerParticles.getPlugin().getDataFolder().mkdir(); - file = new File(PlayerParticles.getPlugin().getDataFolder(), fileName + ".yml"); + file = new File(PlayerParticles.getPlugin().getDataFolder(), fileName + ".yml"); - if (!file.exists()) { - try { - file.createNewFile(); - } catch (Exception e) { - e.printStackTrace(); + if (!file.exists()) { + try { + file.createNewFile(); + } catch (Exception e) { + e.printStackTrace(); + } } - } - config = YamlConfiguration.loadConfiguration(file); + config = YamlConfiguration.loadConfiguration(file); + } } /** @@ -110,18 +112,24 @@ public class ConfigManager { * @param addIfNotFound Adds the pplayer to the processing queue if they are not already in it * @return The found pplayer, or a newly generated one */ - public PPlayer getPPlayer(UUID playerUUID, boolean addIfNotFound) { + public PPlayer getPPlayer(UUID playerUUID, boolean createIfNotFound) { for (PPlayer pp : ParticleManager.particlePlayers) { if (pp.getUniqueId() == playerUUID) return pp; } - - PPlayer pplayer = buildPPlayer(playerUUID); - - if (addIfNotFound && Bukkit.getPlayer(playerUUID) != null) { - ParticleManager.particlePlayers.add(pplayer); + + PPlayer alreadySavedPPlayer = buildPPlayer(playerUUID, false); // If they exist, get them from the database + if (alreadySavedPPlayer != null) { + ParticleManager.particlePlayers.add(alreadySavedPPlayer); + return alreadySavedPPlayer; } - return pplayer; + if (createIfNotFound && Bukkit.getPlayer(playerUUID) != null) { + PPlayer pplayer = buildPPlayer(playerUUID, true); // Build a new PPlayer and store them in the config + ParticleManager.particlePlayers.add(pplayer); + return pplayer; + } + + return null; // Not requesting a new PPlayer and nothing was found, return null } /** @@ -131,7 +139,7 @@ public class ConfigManager { * @param playerUUID The UUID to match the PPlayer to * @return A newly built pplayer */ - private PPlayer buildPPlayer(UUID playerUUID) { + private PPlayer buildPPlayer(UUID playerUUID, boolean createIfNotFound) { if (!PlayerParticles.useMySQL) { if (config.getString(playerUUID.toString() + ".style.name") != null) { ConfigurationSection section = config.getConfigurationSection(playerUUID.toString()); @@ -150,7 +158,7 @@ public class ConfigManager { NoteColor particleNoteColorData = new NoteColor(noteColorDataSection.getInt("note")); return new PPlayer(playerUUID, particleEffect, particleStyle, particleItemData, particleBlockData, particleColorData, particleNoteColorData); - } else { + } else if (createIfNotFound) { PPlayer pplayer = PPlayer.getNewPPlayer(playerUUID); saveNewPPlayer(pplayer); return pplayer; @@ -173,7 +181,7 @@ public class ConfigManager { NoteColor particleNoteColorData = new NoteColor(res.getByte("n.note")); return new PPlayer(playerUUID, particleEffect, particleStyle, particleItemData, particleBlockData, particleColorData, particleNoteColorData); - } else { + } else if (createIfNotFound) { PPlayer pplayer = PPlayer.getNewPPlayer(playerUUID); saveNewPPlayer(pplayer); return pplayer; @@ -288,6 +296,7 @@ public class ConfigManager { * @param particleEffect The effect that is being saved */ public void savePPlayer(UUID playerUUID, ParticleEffect particleEffect) { + PPlayer pplayer = getPPlayer(playerUUID, true); if (!PlayerParticles.useMySQL) { ConfigurationSection section = config.getConfigurationSection(playerUUID.toString() + ".effect"); section.set("name", particleEffect.getName()); @@ -299,7 +308,7 @@ public class ConfigManager { e.printStackTrace(); } } - getPPlayer(playerUUID, false).setParticleEffect(particleEffect); + pplayer.setParticleEffect(particleEffect); } /** @@ -309,6 +318,7 @@ public class ConfigManager { * @param particleStyle The style that is being saved */ public void savePPlayer(UUID playerUUID, ParticleStyle particleStyle) { + PPlayer pplayer = getPPlayer(playerUUID, true); if (!PlayerParticles.useMySQL) { ConfigurationSection section = config.getConfigurationSection(playerUUID.toString() + ".style"); section.set("name", particleStyle.getName()); @@ -320,7 +330,7 @@ public class ConfigManager { e.printStackTrace(); } } - getPPlayer(playerUUID, false).setParticleStyle(particleStyle); + pplayer.setParticleStyle(particleStyle); } /** @@ -330,6 +340,7 @@ public class ConfigManager { * @param particleItemData The data that is being saved */ public void savePPlayer(UUID playerUUID, ItemData particleItemData) { + PPlayer pplayer = getPPlayer(playerUUID, true); if (!PlayerParticles.useMySQL) { ConfigurationSection section = config.getConfigurationSection(playerUUID.toString() + ".itemData"); section.set("material", particleItemData.getMaterial().name()); @@ -342,7 +353,7 @@ public class ConfigManager { e.printStackTrace(); } } - getPPlayer(playerUUID, false).setItemData(particleItemData); + pplayer.setItemData(particleItemData); } /** @@ -352,6 +363,7 @@ public class ConfigManager { * @param particleBlockData The data that is being saved */ public void savePPlayer(UUID playerUUID, BlockData particleBlockData) { + PPlayer pplayer = getPPlayer(playerUUID, true); if (!PlayerParticles.useMySQL) { ConfigurationSection section = config.getConfigurationSection(playerUUID.toString() + ".blockData"); section.set("material", particleBlockData.getMaterial().name()); @@ -364,7 +376,7 @@ public class ConfigManager { e.printStackTrace(); } } - getPPlayer(playerUUID, false).setBlockData(particleBlockData); + pplayer.setBlockData(particleBlockData); } /** @@ -374,6 +386,7 @@ public class ConfigManager { * @param particleColorData The data that is being saved */ public void savePPlayer(UUID playerUUID, OrdinaryColor particleColorData) { + PPlayer pplayer = getPPlayer(playerUUID, true); if (!PlayerParticles.useMySQL) { ConfigurationSection section = config.getConfigurationSection(playerUUID.toString() + ".colorData"); section.set("r", particleColorData.getRed()); @@ -387,7 +400,7 @@ public class ConfigManager { e.printStackTrace(); } } - getPPlayer(playerUUID, false).setColorData(particleColorData); + pplayer.setColorData(particleColorData); } /** @@ -397,6 +410,7 @@ public class ConfigManager { * @param particleNoteColorData The data that is being saved */ public void savePPlayer(UUID playerUUID, NoteColor particleNoteColorData) { + PPlayer pplayer = getPPlayer(playerUUID, true); if (!PlayerParticles.useMySQL) { ConfigurationSection section = config.getConfigurationSection(playerUUID.toString() + ".noteColorData"); section.set("note", (byte) (particleNoteColorData.getValueX() * 24)); @@ -408,7 +422,7 @@ public class ConfigManager { e.printStackTrace(); } } - getPPlayer(playerUUID, false).setNoteColorData(particleNoteColorData); + pplayer.setNoteColorData(particleNoteColorData); } /** @@ -797,7 +811,7 @@ public class ConfigManager { * @return The max distance a fixed effect can be created from the player */ public int getMaxFixedEffectCreationDistance() { - if (maxFixedEffectCreationDistance == -1) { + if (maxFixedEffectCreationDistance == -1) { // Initialize on the fly maxFixedEffectCreationDistance = PlayerParticles.getPlugin().getConfig().getInt("max-fixed-effect-creation-distance"); } return maxFixedEffectCreationDistance; diff --git a/src/com/esophose/playerparticles/manager/ParticleManager.java b/src/com/esophose/playerparticles/manager/ParticleManager.java index 2bbde30..485d05a 100644 --- a/src/com/esophose/playerparticles/manager/ParticleManager.java +++ b/src/com/esophose/playerparticles/manager/ParticleManager.java @@ -32,7 +32,7 @@ import com.esophose.playerparticles.styles.api.PParticle; import com.esophose.playerparticles.styles.api.ParticleStyleManager; public class ParticleManager extends BukkitRunnable implements Listener { - + /** * How far away particles will spawn from players */ @@ -42,12 +42,12 @@ public class ParticleManager extends BukkitRunnable implements Listener { * The list containing all the player effect info */ public static ArrayList particlePlayers = new ArrayList(); - + /** * The list containing all the fixed effect info */ public static ArrayList fixedParticleEffects = new ArrayList(); - + /** * Rainbow particle effect hue and note color used for rainbow colorable effects * These should be moved to a more appropriate place later @@ -62,7 +62,7 @@ public class ParticleManager extends BukkitRunnable implements Listener { */ @EventHandler public void onPlayerJoin(PlayerJoinEvent e) { - ConfigManager.getInstance().getPPlayer(e.getPlayer().getUniqueId(), true); + ConfigManager.getInstance().getPPlayer(e.getPlayer().getUniqueId(), false); } /** @@ -81,7 +81,7 @@ public class ParticleManager extends BukkitRunnable implements Listener { public static void addAllFixedEffects() { fixedParticleEffects.addAll(ConfigManager.getInstance().getAllFixedEffects()); } - + /** * Removes all fixed effects for the given pplayer * @@ -89,11 +89,10 @@ public class ParticleManager extends BukkitRunnable implements Listener { */ public static void removeAllFixedEffectsForPlayer(UUID pplayerUUID) { for (int i = fixedParticleEffects.size() - 1; i >= 0; i--) { - if (fixedParticleEffects.get(i).getOwnerUniqueId().equals(pplayerUUID)) - fixedParticleEffects.remove(i); + if (fixedParticleEffects.get(i).getOwnerUniqueId().equals(pplayerUUID)) fixedParticleEffects.remove(i); } } - + /** * Adds a fixed effect * @@ -102,7 +101,7 @@ public class ParticleManager extends BukkitRunnable implements Listener { public static void addFixedEffect(FixedParticleEffect fixedEffect) { fixedParticleEffects.add(fixedEffect); } - + /** * Removes a fixed effect for the given pplayer with the given id * @@ -111,12 +110,10 @@ public class ParticleManager extends BukkitRunnable implements Listener { */ public static void removeFixedEffectForPlayer(UUID pplayerUUID, int id) { for (int i = fixedParticleEffects.size() - 1; i >= 0; i--) { - if (fixedParticleEffects.get(i).getOwnerUniqueId().equals(pplayerUUID) && - fixedParticleEffects.get(i).getId() == id) - fixedParticleEffects.remove(i); + if (fixedParticleEffects.get(i).getOwnerUniqueId().equals(pplayerUUID) && fixedParticleEffects.get(i).getId() == id) fixedParticleEffects.remove(i); } } - + /** * Clears the list then adds everybody on the server * Used for when the server reloads and we can't rely on players rejoining @@ -124,7 +121,7 @@ public class ParticleManager extends BukkitRunnable implements Listener { public static void refreshPPlayers() { particlePlayers.clear(); for (Player player : Bukkit.getOnlinePlayers()) { - ConfigManager.getInstance().getPPlayer(player.getUniqueId(), true); + ConfigManager.getInstance().getPPlayer(player.getUniqueId(), false); } } @@ -162,62 +159,65 @@ public class ParticleManager extends BukkitRunnable implements Listener { */ public void run() { ParticleStyleManager.updateTimers(); - + hue++; hue %= 360; - + if (hue % 10 == 0) { // Only increment note by 2 notes per second note++; note %= 24; } - - // Loop for PPlayers - for (PPlayer pplayer : particlePlayers) { - Player player = Bukkit.getPlayer(pplayer.getUniqueId()); - - if (player == null) continue; // Skip if they aren't online - + + // Loop over backwards so we can remove pplayers if need be + for (int i = particlePlayers.size() - 1; i >= 0; i--) { + PPlayer pplayer = particlePlayers.get(i); + Player player = pplayer.getPlayer(); + + if (player == null) { // Skip and remove, why are they still in the array if they are offline? + particlePlayers.remove(i); + } + // Perform permission and validity checks boolean valid = true; - + // If the player no longer has permission for the effect, remove it if (!PermissionManager.hasEffectPermission(player, pplayer.getParticleEffect())) { ConfigManager.getInstance().savePPlayer(pplayer.getUniqueId(), ParticleEffect.NONE); valid = false; } - + // If the player no longer has permission for the style, default to none if (!PermissionManager.hasStylePermission(player, pplayer.getParticleStyle())) { ConfigManager.getInstance().savePPlayer(pplayer.getUniqueId(), DefaultStyles.NONE); valid = false; } - + // Check for the string matching to maintain support for 1.7 // This was checking GameMode.SPECTATOR before and was throwing errors if (player.getGameMode().name().equalsIgnoreCase("spectator")) { valid = false; } - + if (ConfigManager.getInstance().isWorldDisabled(player.getWorld().getName())) { valid = false; } - + if (!valid) continue; - + Location loc = player.getLocation(); loc.setY(loc.getY() + 1); displayParticles(pplayer, loc); } - + // Loop for FixedParticleEffects for (FixedParticleEffect effect : fixedParticleEffects) { boolean valid = true; - for (PPlayer pplayer: particlePlayers) { + for (PPlayer pplayer : particlePlayers) { if (pplayer.getUniqueId() == effect.getOwnerUniqueId()) { valid = PermissionManager.canUseFixedEffects(Bukkit.getPlayer(pplayer.getUniqueId())); } } - + if (valid) { displayFixedParticleEffect(effect); } @@ -265,7 +265,7 @@ public class ParticleManager extends BukkitRunnable implements Listener { } } } - + /** * Displays particles at the given fixed effect location * @@ -284,12 +284,12 @@ public class ParticleManager extends BukkitRunnable implements Listener { } } } - + public static OrdinaryColor getRainbowParticleColor() { Color rgb = Color.getHSBColor(hue / 360F, 1.0F, 1.0F); return new OrdinaryColor(rgb.getRed(), rgb.getGreen(), rgb.getBlue()); } - + public static NoteColor getRainbowNoteParticleColor() { return new NoteColor(note); } diff --git a/src/com/esophose/playerparticles/styles/DefaultStyles.java b/src/com/esophose/playerparticles/styles/DefaultStyles.java index dbe69f4..6e08ecf 100644 --- a/src/com/esophose/playerparticles/styles/DefaultStyles.java +++ b/src/com/esophose/playerparticles/styles/DefaultStyles.java @@ -12,19 +12,19 @@ public class DefaultStyles { /** * All the styles that are available by default from this plugin */ - public static ParticleStyle NONE = new ParticleStyleNone(); - public static ParticleStyle BEAM = new ParticleStyleBeam(); - public static ParticleStyle HALO = new ParticleStyleHalo(); - public static ParticleStyle POINT = new ParticleStylePoint(); - public static ParticleStyle MOVE = new ParticleStyleMove(); - public static ParticleStyle SPIN = new ParticleStyleSpin(); - public static ParticleStyle QUADHELIX = new ParticleStyleQuadhelix(); - public static ParticleStyle ORBIT = new ParticleStyleOrbit(); - public static ParticleStyle FEET = new ParticleStyleFeet(); - public static ParticleStyle CUBE = new ParticleStyleCube(); - public static ParticleStyle ARROWS = new ParticleStyleArrows(); - public static ParticleStyle SPIRAL = new ParticleStyleSpiral(); - public static ParticleStyle THICK = new ParticleStyleThick(); + 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(); /** * Registers all the default styles to the ParticleStyleManager diff --git a/src/com/esophose/playerparticles/styles/ParticleStyleMove.java b/src/com/esophose/playerparticles/styles/ParticleStyleMove.java index 3ab53cd..bbf2940 100644 --- a/src/com/esophose/playerparticles/styles/ParticleStyleMove.java +++ b/src/com/esophose/playerparticles/styles/ParticleStyleMove.java @@ -24,7 +24,7 @@ public class ParticleStyleMove extends ParticleStyleNone implements Listener { @EventHandler public void onPlayerMove(PlayerMoveEvent e) { PPlayer pplayer = ConfigManager.getInstance().getPPlayer(e.getPlayer().getUniqueId(), false); - if (pplayer.getParticleStyle() == DefaultStyles.MOVE) { + if (pplayer != null && pplayer.getParticleStyle() == DefaultStyles.MOVE) { if (PermissionManager.hasStylePermission(e.getPlayer(), DefaultStyles.MOVE)) { Location loc = e.getPlayer().getLocation(); loc.setY(loc.getY() + 0.05);