diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 5cc25a2ac..fe0f8eca0 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -129,7 +129,7 @@ public class Entity implements Viewable, Tickable, Schedulable, TagHandler, Perm @Override public void referenceUpdate(@NotNull Point point, @Nullable EntityTracker tracker) { - viewEngine.updateTracker(point, tracker); + viewEngine.updateTracker(instance, point, tracker); } }; diff --git a/src/main/java/net/minestom/server/instance/Chunk.java b/src/main/java/net/minestom/server/instance/Chunk.java index c369dd506..bf6c29e80 100644 --- a/src/main/java/net/minestom/server/instance/Chunk.java +++ b/src/main/java/net/minestom/server/instance/Chunk.java @@ -69,7 +69,7 @@ public abstract class Chunk implements Block.Getter, Block.Setter, Biome.Getter, this.maxSection = (instance.getDimensionType().getMinY() + instance.getDimensionType().getHeight()) / CHUNK_SECTION_SIZE; final EntityTracker tracker = instance.getEntityTracker(); - this.viewers.updateTracker(toPosition(), tracker); + this.viewers.updateTracker(instance, toPosition(), tracker); } /** diff --git a/src/main/java/net/minestom/server/utils/ViewEngine.java b/src/main/java/net/minestom/server/utils/ViewEngine.java index 2d6a166d1..5d241e7a3 100644 --- a/src/main/java/net/minestom/server/utils/ViewEngine.java +++ b/src/main/java/net/minestom/server/utils/ViewEngine.java @@ -7,16 +7,18 @@ import net.minestom.server.coordinate.Point; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Player; import net.minestom.server.instance.EntityTracker; +import net.minestom.server.instance.Instance; +import net.minestom.server.instance.InstanceContainer; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.stream.Stream; /** * Defines which players are able to see this element. @@ -24,9 +26,12 @@ import java.util.function.Predicate; @ApiStatus.Internal public final class ViewEngine { private final Entity entity; - private final Set manualViewers = ConcurrentHashMap.newKeySet(); + private final int range; + private final Set manualViewers = new HashSet<>(); + private Instance instance; private EntityTracker tracker; + private Point lastPoint; // Decide if this entity should be viewable to X players public final Option viewableOption; @@ -40,8 +45,9 @@ public final class ViewEngine { Consumer autoViewableAddition, Consumer autoViewableRemoval, Consumer autoViewerAddition, Consumer autoViewerRemoval) { this.entity = entity; - this.viewableOption = new Option<>(Entity::autoViewEntities, autoViewableAddition, autoViewableRemoval); - this.viewerOption = new Option<>(Entity::isAutoViewable, autoViewerAddition, autoViewerRemoval); + this.range = entity != null ? MinecraftServer.getEntityViewDistance() : MinecraftServer.getChunkViewDistance(); + this.viewableOption = new Option<>(EntityTracker.Target.PLAYERS, Entity::autoViewEntities, autoViewableAddition, autoViewableRemoval); + this.viewerOption = new Option<>(EntityTracker.Target.ENTITIES, Entity::isAutoViewable, autoViewerAddition, autoViewerRemoval); } public ViewEngine(@Nullable Entity entity) { @@ -52,17 +58,11 @@ public final class ViewEngine { this(null); } - public void updateTracker(@NotNull Point point, @Nullable EntityTracker tracker) { + public void updateTracker(@NotNull Instance instance, @NotNull Point point, @Nullable EntityTracker tracker) { synchronized (mutex) { + this.instance = instance; + this.lastPoint = point; this.tracker = tracker; - if (tracker != null) { - final int range = entity != null ? MinecraftServer.getEntityViewDistance() : MinecraftServer.getChunkViewDistance(); - this.viewableOption.references = tracker.references(point, range, EntityTracker.Target.PLAYERS); - this.viewerOption.references = tracker.references(point, range, EntityTracker.Target.ENTITIES); - } else { - this.viewableOption.references = null; - this.viewerOption.references = null; - } } } @@ -127,6 +127,8 @@ public final class ViewEngine { public final class Option { @SuppressWarnings("rawtypes") private static final AtomicIntegerFieldUpdater