From bd3e4e2f0a3f28bc1b41bcdaa77344f8d1d68491 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 15 Apr 2021 03:08:19 +0200 Subject: [PATCH] Added Acquirable#currentEntities --- .../java/net/minestom/server/entity/Player.java | 2 +- .../java/net/minestom/server/lock/Acquirable.java | 14 ++++++++++++++ .../net/minestom/server/thread/ThreadProvider.java | 6 ++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 629a530d4..637a41bbb 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -561,7 +561,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, @Override public void remove() { - if(isRemoved()) + if (isRemoved()) return; callEvent(PlayerDisconnectEvent.class, new PlayerDisconnectEvent(this)); diff --git a/src/main/java/net/minestom/server/lock/Acquirable.java b/src/main/java/net/minestom/server/lock/Acquirable.java index 44621d63a..0e678bb95 100644 --- a/src/main/java/net/minestom/server/lock/Acquirable.java +++ b/src/main/java/net/minestom/server/lock/Acquirable.java @@ -1,10 +1,13 @@ package net.minestom.server.lock; +import net.minestom.server.entity.Entity; import net.minestom.server.instance.Chunk; import net.minestom.server.thread.BatchThread; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.concurrent.Phaser; import java.util.function.Consumer; @@ -20,6 +23,17 @@ import java.util.function.Consumer; */ public interface Acquirable { + ThreadLocal> CURRENT_ENTITIES = ThreadLocal.withInitial(Collections::emptyList); + + static @NotNull Collection<@NotNull Entity> currentEntities() { + return CURRENT_ENTITIES.get(); + } + + @ApiStatus.Internal + static void refreshEntities(@NotNull Collection<@NotNull Entity> entities) { + CURRENT_ENTITIES.set(entities); + } + /** * Blocks the current thread until 'this' can be acquired, * and execute {@code consumer} as a callback with the acquired object. diff --git a/src/main/java/net/minestom/server/thread/ThreadProvider.java b/src/main/java/net/minestom/server/thread/ThreadProvider.java index 383164260..e9a2d8046 100644 --- a/src/main/java/net/minestom/server/thread/ThreadProvider.java +++ b/src/main/java/net/minestom/server/thread/ThreadProvider.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; +import java.util.stream.Collectors; /** * Used to link chunks into multiple groups. @@ -97,6 +98,11 @@ public abstract class ThreadProvider { // Execute tick thread.getMainRunnable().startTick(countDownLatch, () -> { + final var entitiesList = chunkEntries.stream().map(chunkEntry -> chunkEntry.entities).collect(Collectors.toList()); + final var entities = entitiesList.stream() + .flatMap(Collection::stream) + .collect(Collectors.toList()); + Acquirable.refreshEntities(Collections.unmodifiableList(entities)); chunkEntries.forEach(chunkEntry -> { chunkEntry.chunk.tick(time); chunkEntry.entities.forEach(entity -> {