From c57f86c7ab9ffe85033bd2010e99f9983450f65c Mon Sep 17 00:00:00 2001
From: Yannick Lamprecht <1420893+yannicklamprecht@users.noreply.github.com>
Date: Sat, 3 Dec 2022 23:46:38 +0100
Subject: [PATCH] Player Entity Tracking Events (#4722)

---
 .../api/Player-Entity-Tracking-Events.patch   | 101 ++++++++++++++++++
 .../Player-Entity-Tracking-Events.patch       |  34 ++++++
 2 files changed, 135 insertions(+)
 create mode 100644 patches/api/Player-Entity-Tracking-Events.patch
 create mode 100644 patches/server/Player-Entity-Tracking-Events.patch

diff --git a/patches/api/Player-Entity-Tracking-Events.patch b/patches/api/Player-Entity-Tracking-Events.patch
new file mode 100644
index 0000000000..be2ba43a1e
--- /dev/null
+++ b/patches/api/Player-Entity-Tracking-Events.patch
@@ -0,0 +1,101 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Yannick Lamprecht <yannicklamprecht@live.de>
+Date: Wed, 30 Mar 2022 18:16:37 +0200
+Subject: [PATCH] Player Entity Tracking Events
+
+
+diff --git a/src/main/java/io/papermc/paper/event/player/PlayerTrackEntityEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerTrackEntityEvent.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
+--- /dev/null
++++ b/src/main/java/io/papermc/paper/event/player/PlayerTrackEntityEvent.java
+@@ -0,0 +0,0 @@
++package io.papermc.paper.event.player;
++
++import org.bukkit.entity.Entity;
++import org.bukkit.entity.Player;
++import org.bukkit.event.HandlerList;
++import org.bukkit.event.player.PlayerEvent;
++import org.jetbrains.annotations.NotNull;
++
++/**
++ * Is called when a {@link Player} tracks an {@link Entity}.
++ */
++public class PlayerTrackEntityEvent extends PlayerEvent {
++
++    private static final HandlerList handlers = new HandlerList();
++    private final Entity entity;
++
++    public PlayerTrackEntityEvent(@NotNull Player player, @NotNull Entity entity) {
++        super(player);
++        this.entity = entity;
++    }
++
++    @NotNull
++    public static HandlerList getHandlerList() {
++        return handlers;
++    }
++
++    @NotNull
++    @Override
++    public HandlerList getHandlers() {
++        return handlers;
++    }
++
++    /**
++     * Gets the entity that will be tracked
++     *
++     * @return the entity tracked
++     */
++    @NotNull
++    public Entity getEntity() {
++        return entity;
++    }
++}
+diff --git a/src/main/java/io/papermc/paper/event/player/PlayerUntrackEntityEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerUntrackEntityEvent.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
+--- /dev/null
++++ b/src/main/java/io/papermc/paper/event/player/PlayerUntrackEntityEvent.java
+@@ -0,0 +0,0 @@
++package io.papermc.paper.event.player;
++
++import org.bukkit.entity.Entity;
++import org.bukkit.entity.Player;
++import org.bukkit.event.HandlerList;
++import org.bukkit.event.player.PlayerEvent;
++import org.jetbrains.annotations.NotNull;
++
++/**
++ * Is called when a {@link Player} untracks an {@link Entity}.
++ */
++public class PlayerUntrackEntityEvent extends PlayerEvent {
++
++    private static final HandlerList handlers = new HandlerList();
++    private final Entity entity;
++
++    public PlayerUntrackEntityEvent(@NotNull Player player, @NotNull Entity entity) {
++        super(player);
++        this.entity = entity;
++    }
++
++    @NotNull
++    public static HandlerList getHandlerList() {
++        return handlers;
++    }
++
++    @NotNull
++    @Override
++    public HandlerList getHandlers() {
++        return handlers;
++    }
++
++    /**
++     * Gets the entity that will be untracked
++     * @return the entity untracked
++     */
++    @NotNull
++    public Entity getEntity() {
++        return entity;
++    }
++}
diff --git a/patches/server/Player-Entity-Tracking-Events.patch b/patches/server/Player-Entity-Tracking-Events.patch
new file mode 100644
index 0000000000..995c1b0b77
--- /dev/null
+++ b/patches/server/Player-Entity-Tracking-Events.patch
@@ -0,0 +1,34 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Yannick Lamprecht <yannicklamprecht@live.de>
+Date: Wed, 30 Mar 2022 18:16:52 +0200
+Subject: [PATCH] Player Entity Tracking Events
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
+         EnchantmentHelper.doPostDamageEffects(attacker, target);
+     }
+ 
+-    public void startSeenByPlayer(ServerPlayer player) {}
++    // Paper start
++    public void startSeenByPlayer(ServerPlayer player) {
++        if (io.papermc.paper.event.player.PlayerTrackEntityEvent.getHandlerList().getRegisteredListeners().length > 0) {
++            new io.papermc.paper.event.player.PlayerTrackEntityEvent(player.getBukkitEntity(), this.getBukkitEntity()).callEvent();
++        }
++    }
++    // Paper end
+ 
+-    public void stopSeenByPlayer(ServerPlayer player) {}
++    // Paper start
++    public void stopSeenByPlayer(ServerPlayer player) {
++        if(io.papermc.paper.event.player.PlayerUntrackEntityEvent.getHandlerList().getRegisteredListeners().length > 0) {
++            new io.papermc.paper.event.player.PlayerUntrackEntityEvent(player.getBukkitEntity(), this.getBukkitEntity()).callEvent();
++        }
++    }
++    // Paper end
+ 
+     public float rotate(Rotation rotation) {
+         float f = Mth.wrapDegrees(this.getYRot());