diff --git a/api/src/main/java/me/tofaa/entitylib/ve/ViewerEngineListener.java b/api/src/main/java/me/tofaa/entitylib/ve/ViewerEngineListener.java index ac4d89a..aadfe24 100644 --- a/api/src/main/java/me/tofaa/entitylib/ve/ViewerEngineListener.java +++ b/api/src/main/java/me/tofaa/entitylib/ve/ViewerEngineListener.java @@ -2,6 +2,7 @@ import com.github.retrooper.packetevents.event.PacketListenerAbstract; import com.github.retrooper.packetevents.event.PacketSendEvent; +import com.github.retrooper.packetevents.event.UserDisconnectEvent; import com.github.retrooper.packetevents.protocol.packettype.PacketType; import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon; import com.github.retrooper.packetevents.protocol.player.User; @@ -11,6 +12,7 @@ import me.tofaa.entitylib.utils.Check; import me.tofaa.entitylib.wrapper.WrapperEntity; +import java.util.UUID; import java.util.function.Consumer; final class ViewerEngineListener extends PacketListenerAbstract { @@ -81,6 +83,24 @@ else if (type == PacketType.Play.Server.CHUNK_DATA) { } } + @Override + public void onUserDisconnect(final UserDisconnectEvent event) { + engine.getExecutor().execute(() -> { + final UUID uniqueId = event.getUser().getUUID(); + + // Note from Chubbyduck1: While this says it's non-null, it can actually be null in this case. Not sure why. When run without this, it would spam NPEs for me. + if (uniqueId == null) { + return; + } + + engine.getTracked0().forEach(entity -> { + if (entity.hasViewer(uniqueId)) { + entity.removeViewerSilently(uniqueId); + } + }); + }); + } + private void genericSpawnCheck(int entityId, User user) { WrapperEntity entity = EntityLib.getApi().getEntity(entityId); if (entity == null) return;