From 68e5e21964d366e2ef9e19b6e8b687ae03470a55 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sun, 14 Nov 2021 18:36:35 +0100 Subject: [PATCH] Initial Witness interface Signed-off-by: TheMode --- .../java/net/minestom/server/Witness.java | 64 +++++++++++++++++++ .../net/minestom/server/entity/Entity.java | 61 ++++-------------- 2 files changed, 77 insertions(+), 48 deletions(-) create mode 100644 src/main/java/net/minestom/server/Witness.java diff --git a/src/main/java/net/minestom/server/Witness.java b/src/main/java/net/minestom/server/Witness.java new file mode 100644 index 000000000..22d559ae7 --- /dev/null +++ b/src/main/java/net/minestom/server/Witness.java @@ -0,0 +1,64 @@ +package net.minestom.server; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Player; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Predicate; + +public interface Witness extends Viewable { + + /** + * Gets if this entity is automatically sent to surrounding players. + * True by default. + * + * @return true if the entity is automatically viewable for close players, false otherwise + */ + boolean isAutoViewable(); + + void setAutoViewable(boolean autoViewable); + + void updateViewableRule(@NotNull Predicate predicate); + + @ApiStatus.Experimental + void updateViewableRule(); + + /** + * Gets if surrounding entities are automatically visible by this. + * True by default. + * + * @return true if surrounding entities are visible by this + */ + @ApiStatus.Experimental + boolean autoViewEntities(); + + /** + * Decides if surrounding entities must be visible. + * + * @param autoViewer true to add view surrounding entities, false to remove + */ + @ApiStatus.Experimental + void setAutoViewEntities(boolean autoViewer); + + @ApiStatus.Experimental + void updateViewerRule(@NotNull Predicate predicate); + + @ApiStatus.Experimental + void updateViewerRule(); + + /** + * Gets if this entity's viewers (surrounding players) can be predicted from surrounding chunks. + */ + boolean hasPredictableViewers(); + + @ApiStatus.Internal + default void updateNewViewer(@NotNull Player player) { + // Empty + } + + @ApiStatus.Internal + default void updateOldViewer(@NotNull Player player) { + // Empty + } +} diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index fafd7e6bf..7fbc11e91 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -7,7 +7,7 @@ import net.kyori.adventure.text.event.HoverEvent.ShowEntity; import net.kyori.adventure.text.event.HoverEventSource; import net.minestom.server.MinecraftServer; import net.minestom.server.Tickable; -import net.minestom.server.Viewable; +import net.minestom.server.Witness; import net.minestom.server.acquirable.Acquirable; import net.minestom.server.collision.BoundingBox; import net.minestom.server.collision.CollisionUtils; @@ -67,7 +67,7 @@ import java.util.function.UnaryOperator; *

* To create your own entity you probably want to extends {@link LivingEntity} or {@link EntityCreature} instead. */ -public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler, HoverEventSource, Sound.Emitter { +public class Entity implements Witness, Tickable, TagHandler, PermissionHandler, HoverEventSource, Sound.Emitter { private static final Map ENTITY_BY_ID = new ConcurrentHashMap<>(); private static final Map ENTITY_BY_UUID = new ConcurrentHashMap<>(); @@ -343,63 +343,42 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler lookAt(entity.position); } - /** - * Gets if this entity is automatically sent to surrounding players. - * True by default. - * - * @return true if the entity is automatically viewable for close players, false otherwise - */ + @Override public boolean isAutoViewable() { return viewEngine.viewableOption.isAuto(); } - /** - * Decides if this entity should be auto-viewable by nearby players. - * - * @param autoViewable true to add surrounding players, false to remove - * @see #isAutoViewable() - */ + @Override public void setAutoViewable(boolean autoViewable) { this.viewEngine.viewableOption.updateAuto(autoViewable); } - @ApiStatus.Experimental + @Override public void updateViewableRule(@NotNull Predicate predicate) { this.viewEngine.viewableOption.updateRule(predicate); } - @ApiStatus.Experimental + @Override public void updateViewableRule() { this.viewEngine.viewableOption.updateRule(); } - /** - * Gets if surrounding entities are automatically visible by this. - * True by default. - * - * @return true if surrounding entities are visible by this - */ - @ApiStatus.Experimental + @Override public boolean autoViewEntities() { return viewEngine.viewerOption.isAuto(); } - /** - * Decides if surrounding entities must be visible. - * - * @param autoViewer true to add view surrounding entities, false to remove - */ - @ApiStatus.Experimental + @Override public void setAutoViewEntities(boolean autoViewer) { this.viewEngine.viewerOption.updateAuto(autoViewer); } - @ApiStatus.Experimental + @Override public void updateViewerRule(@NotNull Predicate predicate) { this.viewEngine.viewerOption.updateRule(predicate); } - @ApiStatus.Experimental + @Override public void updateViewerRule() { this.viewEngine.viewerOption.updateRule(); } @@ -418,13 +397,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler return true; } - /** - * Called when a new viewer must be shown. - * Method can be subject to deadlocking if the target's viewers are also accessed. - * - * @param player the player to send the packets to - */ - @ApiStatus.Internal + @Override public void updateNewViewer(@NotNull Player player) { player.sendPacket(getEntityType().registry().spawnType().getSpawnPacket(this)); if (hasVelocity()) player.sendPacket(getVelocityPacket()); @@ -441,13 +414,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler player.sendPacket(new EntityHeadLookPacket(getEntityId(), position.yaw())); } - /** - * Called when a viewer must be destroyed. - * Method can be subject to deadlocking if the target's viewers are also accessed. - * - * @param player the player to send the packets to - */ - @ApiStatus.Internal + @Override public void updateOldViewer(@NotNull Player player) { final Set passengers = this.passengers; if (!passengers.isEmpty()) { @@ -463,9 +430,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler return viewers; } - /** - * Gets if this entity's viewers (surrounding players) can be predicted from surrounding chunks. - */ + @Override public boolean hasPredictableViewers() { return viewEngine.hasPredictableViewers(); }