diff --git a/build.gradle b/build.gradle index 4c87bcf..38f192c 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ sourceCompatibility = 1.8 targetCompatibility = 1.8 compileJava.options.encoding = 'UTF-8' group = 'dev.esophose' -version = '7.8' +version = '7.9' java { withJavadocJar() diff --git a/changelog.txt b/changelog.txt index 3600f6d..96c9e24 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +=== v7.9 === +* Fixed performance issues with toggle-on-move setting +* Fixed possible concurrency deadlock with arrows and fishing styles === v7.8 === + Added style 'fishing' * Moved GUI icon settings from the config.yml to the effects/ and styles/ files. You will need to set these again. diff --git a/src/main/java/dev/esophose/playerparticles/particles/listener/PPlayerCombatListener.java b/src/main/java/dev/esophose/playerparticles/particles/listener/PPlayerCombatListener.java index decef19..35a4f8a 100644 --- a/src/main/java/dev/esophose/playerparticles/particles/listener/PPlayerCombatListener.java +++ b/src/main/java/dev/esophose/playerparticles/particles/listener/PPlayerCombatListener.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; @@ -55,10 +56,7 @@ public class PPlayerCombatListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR) public void onPlayerAttack(EntityDamageByEntityEvent event) { - if (!Setting.TOGGLE_ON_COMBAT.getBoolean()) - return; - - if (!(event.getEntity() instanceof Player)) + if (event.getEntity().getType() != EntityType.PLAYER) return; Player attacker; diff --git a/src/main/java/dev/esophose/playerparticles/particles/listener/PPlayerMovementListener.java b/src/main/java/dev/esophose/playerparticles/particles/listener/PPlayerMovementListener.java index c60d052..efe1cc9 100644 --- a/src/main/java/dev/esophose/playerparticles/particles/listener/PPlayerMovementListener.java +++ b/src/main/java/dev/esophose/playerparticles/particles/listener/PPlayerMovementListener.java @@ -11,21 +11,38 @@ import java.util.Map; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; +import org.bukkit.entity.Player; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.util.Vector; public class PPlayerMovementListener implements Listener { private static final int CHECK_INTERVAL = 3; private Map timeSinceLastMovement; + private Map previousVectors; public PPlayerMovementListener() { DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class); this.timeSinceLastMovement = new HashMap<>(); + this.previousVectors = new HashMap<>(); Bukkit.getScheduler().runTaskTimer(PlayerParticles.getInstance(), () -> { + for (Player player : Bukkit.getOnlinePlayers()) { + UUID playerUUID = player.getUniqueId(); + Vector previousVector = this.previousVectors.get(playerUUID); + Location currentLocation = player.getLocation(); + Vector currentVector = new Vector(currentLocation.getBlockX(), currentLocation.getBlockY(), currentLocation.getBlockZ()); + this.previousVectors.put(playerUUID, currentVector); + + if (previousVector == null || !previousVector.equals(currentVector)) { + if (!this.timeSinceLastMovement.containsKey(playerUUID)) { + this.timeSinceLastMovement.put(playerUUID, 0); + } else { + this.timeSinceLastMovement.replace(playerUUID, 0); + } + } + } + List toRemove = new ArrayList<>(); for (UUID uuid : this.timeSinceLastMovement.keySet()) { @@ -45,24 +62,4 @@ public class PPlayerMovementListener implements Listener { }, 0, CHECK_INTERVAL); } - /** - * Used to detect if the player is moving - * - * @param event The event - */ - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerMove(PlayerMoveEvent event) { - Location to = event.getTo(); - Location from = event.getFrom(); - if (to == null || (to.getBlockX() == from.getBlockX() && to.getBlockY() == from.getBlockY() && to.getBlockZ() == from.getBlockZ())) - return; - - UUID playerUUID = event.getPlayer().getUniqueId(); - if (!this.timeSinceLastMovement.containsKey(playerUUID)) { - this.timeSinceLastMovement.put(playerUUID, 0); - } else { - this.timeSinceLastMovement.replace(playerUUID, 0); - } - } - }