From e62ce5d0524de017e87668b419ca76901d011c05 Mon Sep 17 00:00:00 2001 From: Archer Date: Thu, 3 Feb 2022 04:57:00 +0100 Subject: [PATCH] event: Add PlayerTrackEntityEvent This commit adds an event that gets fired whenever an entity is added to a player's entity tracker. Cancelling this event prevents the entity from being added, and consequently, the entity is never sent (nor updated) for the player. While this is essentially the same method that Bukkit's hidden player system uses, simply cancelling the event does not make sure that the entity is not interacted with, and the player can still see them in some places (e.g. in the player list and the scoreboard). --- ...068-event-Add-PlayerTrackEntityEvent.patch | 94 +++++++++++++++++++ ...228-event-Add-PlayerTrackEntityEvent.patch | 53 +++++++++++ 2 files changed, 147 insertions(+) create mode 100644 Spigot-API-Patches/0068-event-Add-PlayerTrackEntityEvent.patch create mode 100644 Spigot-Server-Patches/0228-event-Add-PlayerTrackEntityEvent.patch diff --git a/Spigot-API-Patches/0068-event-Add-PlayerTrackEntityEvent.patch b/Spigot-API-Patches/0068-event-Add-PlayerTrackEntityEvent.patch new file mode 100644 index 000000000000..63a025278146 --- /dev/null +++ b/Spigot-API-Patches/0068-event-Add-PlayerTrackEntityEvent.patch @@ -0,0 +1,94 @@ +From c8c2aa31661e8b65a2a512eadf8a56d50ce01bc1 Mon Sep 17 00:00:00 2001 +From: Archer +Date: Thu, 3 Feb 2022 04:55:02 +0100 +Subject: [PATCH] event: Add PlayerTrackEntityEvent + +This commit adds an event that gets fired whenever an entity is added to +a player's entity tracker. Cancelling this event prevents the entity +from being added, and consequently, the entity is never sent (nor +updated) for the player. While this is essentially the same method that +Bukkit's hidden player system uses, simply cancelling the event does +not make sure that the entity is not interacted with, and the player can +still see them in some places (e.g. in the player list and the +scoreboard). + +diff --git a/src/main/java/dev/rocco/kig/paper/api/event/PlayerTrackEntityEvent.java b/src/main/java/dev/rocco/kig/paper/api/event/PlayerTrackEntityEvent.java +new file mode 100644 +index 00000000..848ffcae +--- /dev/null ++++ b/src/main/java/dev/rocco/kig/paper/api/event/PlayerTrackEntityEvent.java +@@ -0,0 +1,71 @@ ++package dev.rocco.kig.paper.api.event; ++ ++import org.bukkit.entity.Entity; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.player.PlayerEvent; ++ ++/** ++ * Fired when an {@link Entity} is added to a {@link Player}'s entity tracker. ++ * Cancelling the event will prevent the given entity from entering the player's ++ * entity tracker. ++ */ ++public class PlayerTrackEntityEvent extends PlayerEvent implements Cancellable { ++ private static final HandlerList handlers = new HandlerList(); ++ ++ private final Entity tracked; ++ private boolean cancelled; ++ ++ /** ++ * Creates a new {@code PlayerTrackEntityEvent} for the given player and tracked entity. ++ * ++ * @param player the player who the entity is added for ++ * @param tracked the entity that is to be added to the player's entity tracker ++ */ ++ public PlayerTrackEntityEvent(Player player, Entity tracked) { ++ super(player); ++ this.tracked = tracked; ++ } ++ ++ /** ++ * Returns the list of handlers that handle a {@code PlayerTrackEntityEvent}. ++ */ ++ public static HandlerList getHandlerList() { ++ return handlers; ++ } ++ ++ /** ++ * Returns the list of handlers that handle a {@code PlayerTrackEntityEvent}. ++ */ ++ @Override ++ public HandlerList getHandlers() { ++ return handlers; ++ } ++ ++ /** ++ * Returns the entity that is to be tracked in the player's tracker ++ */ ++ public Entity getTracked() { ++ return tracked; ++ } ++ ++ /** ++ * Returns whether this event is cancelled. ++ */ ++ @Override ++ public boolean isCancelled() { ++ return cancelled; ++ } ++ ++ /** ++ * Sets the cancelled status of this event. Cancelling the event will prevent the entity from being added to the ++ * player's entity tracker. ++ * ++ * @param cancel true if you wish to cancel this event ++ */ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancelled = cancel; ++ } ++} +-- +2.35.1 + diff --git a/Spigot-Server-Patches/0228-event-Add-PlayerTrackEntityEvent.patch b/Spigot-Server-Patches/0228-event-Add-PlayerTrackEntityEvent.patch new file mode 100644 index 000000000000..bfcf7b36d751 --- /dev/null +++ b/Spigot-Server-Patches/0228-event-Add-PlayerTrackEntityEvent.patch @@ -0,0 +1,53 @@ +From 11a91afb519a719ae3f508b0e40099cd76e40636 Mon Sep 17 00:00:00 2001 +From: Archer +Date: Thu, 3 Feb 2022 04:55:02 +0100 +Subject: [PATCH] event: Add PlayerTrackEntityEvent + +This commit adds an event that gets fired whenever an entity is added to +a player's entity tracker. Cancelling this event prevents the entity +from being added, and consequently, the entity is never sent (nor +updated) for the player. While this is essentially the same method that +Bukkit's hidden player system uses, simply cancelling the event does +not make sure that the entity is not interacted with, and the player can +still see them in some places (e.g. in the player list and the +scoreboard). + +diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java +index 216f03972..369307970 100644 +--- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java ++++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java +@@ -1,16 +1,17 @@ + package net.minecraft.server; + +-import com.google.common.collect.Sets; + import java.util.Collection; + import java.util.Iterator; + import java.util.List; + import java.util.Set; + ++import dev.rocco.kig.paper.api.event.PlayerTrackEntityEvent; + import dev.rocco.kig.paper.impl.cheetah.SinkEntityPlayer; + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + + // CraftBukkit start ++import org.bukkit.Bukkit; // KigPaper + import org.bukkit.entity.Player; + import org.bukkit.event.player.PlayerVelocityEvent; + // CraftBukkit end +@@ -340,6 +341,12 @@ public class EntityTrackerEntry { + if (entityplayer != this.tracker) { + if (this.c(entityplayer)) { + if (!this.trackedPlayers.contains(entityplayer) && (this.e(entityplayer) || this.tracker.attachedToPlayer)) { ++ // KigPaper start ++ PlayerTrackEntityEvent event = new PlayerTrackEntityEvent(entityplayer.getBukkitEntity(), tracker.bukkitEntity); ++ Bukkit.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) return; ++ // KigPaper end ++ + // CraftBukkit start - respect vanish API + if (this.tracker instanceof EntityPlayer) { + Player player = ((EntityPlayer) this.tracker).getBukkitEntity(); +-- +2.35.1 +