From fa41aabaed36b27efa9ddc9a8353eb4cbf443649 Mon Sep 17 00:00:00 2001 From: ThatCreeper Date: Wed, 30 Dec 2020 18:47:43 -0600 Subject: [PATCH] Make Potions use time instead of nanoTime --- .../net/minestom/server/entity/Entity.java | 56 ++++++------------- .../minestom/server/potion/TimedPotion.java | 11 ++++ 2 files changed, 28 insertions(+), 39 deletions(-) create mode 100644 src/main/java/net/minestom/server/potion/TimedPotion.java diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 4a05ca143..ef44c1858 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -24,6 +24,7 @@ import net.minestom.server.permission.Permission; import net.minestom.server.permission.PermissionHandler; import net.minestom.server.potion.Potion; import net.minestom.server.potion.PotionEffect; +import net.minestom.server.potion.TimedPotion; import net.minestom.server.thread.ThreadProvider; import net.minestom.server.utils.BlockPosition; import net.minestom.server.utils.Position; @@ -43,6 +44,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; @@ -132,8 +134,8 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P protected boolean noGravity; protected Pose pose = Pose.STANDING; - private ArrayList effects = new ArrayList<>(); - private ArrayList effectTimes = new ArrayList<>(); + private CopyOnWriteArrayList effects = new CopyOnWriteArrayList<>(); + private CopyOnWriteArrayList scheduledPotions = new CopyOnWriteArrayList<>(); // list of scheduled tasks to be executed during the next entity tick protected final Queue> nextTick = Queues.newConcurrentLinkedQueue(); @@ -403,25 +405,17 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P // remove expired effects { - if (effects.size() > 0) { - boolean foundToRemove = true; - while (foundToRemove) { - foundToRemove = false; - int i = 0; - while (i < effects.size()) { - if (effects.get(i).duration * 50 + - effectTimes.get(i) <= System.nanoTime() / 1000000) { - foundToRemove = true; - break; - } - i++; - } - if (foundToRemove) { - effects.remove(i); - effectTimes.remove(i); - } - } + effects.removeIf(timedPotion -> time >= + (timedPotion.startingTime + timedPotion.potion.duration * 50)); + } + + // add queued effects + { + for (Potion potion : scheduledPotions) { + effects.add(new TimedPotion(potion, time)); + potion.sendAddPacket(this); } + scheduledPotions.clear(); } // scheduled tasks @@ -1470,7 +1464,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P DYING } - public List getActiveEffects() { + public List getActiveEffects() { return effects; } @@ -1480,21 +1474,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param effect The effect to remove */ public void removeEffect(@NotNull PotionEffect effect) { - if (effects.size() == 0) return; - int i = 0; - boolean found = false; - while (i < effects.size()) { - if (effects.get(i).effect == effect) { - found = true; - break; - } - i++; - } - if (found) { - effects.get(i).sendRemovePacket(this); - effects.remove(i); - effectTimes.remove(i); - } + effects.removeIf(timedPotion -> timedPotion.potion.effect == effect); } /** @@ -1504,9 +1484,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P */ public void addEffect(@NotNull Potion potion) { removeEffect(potion.effect); - effects.add(potion); - effectTimes.add(System.nanoTime() / 1000000); - potion.sendAddPacket(this); + scheduledPotions.add(potion); } protected boolean shouldRemove() { diff --git a/src/main/java/net/minestom/server/potion/TimedPotion.java b/src/main/java/net/minestom/server/potion/TimedPotion.java new file mode 100644 index 000000000..46d2c7819 --- /dev/null +++ b/src/main/java/net/minestom/server/potion/TimedPotion.java @@ -0,0 +1,11 @@ +package net.minestom.server.potion; + +public class TimedPotion { + public Potion potion; + public Long startingTime; + + public TimedPotion(Potion potion, Long startingTime) { + this.potion = potion; + this.startingTime = startingTime; + } +}