From e8c9278e76a92817caa5f30073bd51ff40f57fd0 Mon Sep 17 00:00:00 2001 From: Esophose Date: Sun, 19 Apr 2020 15:26:48 -0600 Subject: [PATCH] Concurrency adjustments for arrows and fishing styles --- .../styles/ParticleStyleArrows.java | 22 ++++++++++-------- .../styles/ParticleStyleFishing.java | 23 ++++++++++++------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleArrows.java b/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleArrows.java index 00d36d2..c9605e8 100644 --- a/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleArrows.java +++ b/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleArrows.java @@ -1,5 +1,6 @@ package dev.esophose.playerparticles.styles; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.config.CommentedFileConfiguration; import dev.esophose.playerparticles.particles.PParticle; import dev.esophose.playerparticles.particles.ParticlePair; @@ -7,6 +8,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; @@ -26,7 +28,16 @@ public class ParticleStyleArrows extends DefaultParticleStyle implements Listene public ParticleStyleArrows() { super("arrows", false, false, 0); - this.projectiles = Collections.synchronizedList(new ArrayList<>()); + this.projectiles = new ArrayList<>(); + + // Removes all arrows that are considered dead + Bukkit.getScheduler().runTaskTimer(PlayerParticles.getInstance(), () -> { + for (int i = this.projectiles.size() - 1; i >= 0; i--) { + Projectile projectile = this.projectiles.get(i); + if ((this.arrowTrackingTime != -1 && projectile.getTicksLived() >= this.arrowTrackingTime) || !projectile.isValid() || projectile.getShooter() == null) + this.projectiles.remove(i); + } + }, 0L, 5L); } @Override @@ -52,16 +63,9 @@ public class ParticleStyleArrows extends DefaultParticleStyle implements Listene return particles; } - /** - * Removes all arrows that are considered dead - */ @Override public void updateTimers() { - for (int i = this.projectiles.size() - 1; i >= 0; i--) { - Projectile projectile = this.projectiles.get(i); - if ((this.arrowTrackingTime != -1 && projectile.getTicksLived() >= this.arrowTrackingTime) || projectile.isDead() || !projectile.isValid() || projectile.getShooter() == null) - this.projectiles.remove(i); - } + } @Override diff --git a/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleFishing.java b/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleFishing.java index 37a3957..357772b 100644 --- a/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleFishing.java +++ b/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleFishing.java @@ -1,14 +1,19 @@ package dev.esophose.playerparticles.styles; +import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.config.CommentedFileConfiguration; import dev.esophose.playerparticles.particles.PParticle; import dev.esophose.playerparticles.particles.ParticlePair; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.entity.FishHook; import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -26,12 +31,15 @@ public class ParticleStyleFishing extends DefaultParticleStyle implements Listen } } - private List projectiles; + private Set projectiles; public ParticleStyleFishing() { super("fishing", false, false, 0); - this.projectiles = Collections.synchronizedList(new ArrayList<>()); + this.projectiles = new HashSet<>(); + + // Removes all fish hooks that are considered dead + Bukkit.getScheduler().runTaskTimer(PlayerParticles.getInstance(), () -> this.projectiles.removeIf(x -> !x.isValid()), 0L, 5L); } @Override @@ -45,12 +53,9 @@ public class ParticleStyleFishing extends DefaultParticleStyle implements Listen return particles; } - /** - * Removes all fish hooks that are considered dead - */ @Override public void updateTimers() { - this.projectiles.removeIf(x -> !x.isValid()); + } @Override @@ -75,7 +80,9 @@ public class ParticleStyleFishing extends DefaultParticleStyle implements Listen case "CAUGHT_FISH": case "CAUGHT_ENTITY": case "REEL_IN": - this.projectiles.remove(event.getHook()); + try { + this.projectiles.remove((Projectile) PlayerFishEvent_getHook.invoke(event)); + } catch (ReflectiveOperationException ignored) { } break; } }