Paper/patches/api/0387-Add-PrePlayerAttackEntityEvent.patch
Jake Potrebic 2f92d4e00e
Updated Upstream (Bukkit/CraftBukkit)
Upstream has released updates that appear to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
01bb6ba7 PR-936: Add new PersistentDataContainer methods and clean up docs
bc145b90 PR-940: Create registry for banner pattern and cat type

CraftBukkit Changes:
cb2ea54de SPIGOT-7440, PR-1292: Fire EntityTeleportEvent for end gateways
4fea66e44 PR-1299: Add new PersistentDataContainer methods and clean up docs
b483a20db PR-1303: Create registry for banner pattern and cat type
4642dd526 SPIGOT-7535: Fix maps not having an ID and also call MapInitializeEvent in more places
2023-12-08 11:00:39 -08:00

100 lines
3.3 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Sun, 18 Sep 2022 13:10:28 -0400
Subject: [PATCH] Add PrePlayerAttackEntityEvent
diff --git a/src/main/java/io/papermc/paper/event/player/PrePlayerAttackEntityEvent.java b/src/main/java/io/papermc/paper/event/player/PrePlayerAttackEntityEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..d49999ea597ef247bbf2298e6bf5600bfe003c3e
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/player/PrePlayerAttackEntityEvent.java
@@ -0,0 +1,87 @@
+package io.papermc.paper.event.player;
+
+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;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Called when the player tries to attack an entity.
+ *
+ * This occurs before any of the damage logic, so cancelling this event
+ * will prevent any sort of sounds from being played when attacking.
+ *
+ * This event will fire as cancelled for certain entities, with {@link PrePlayerAttackEntityEvent#willAttack()} being false
+ * to indicate that this entity will not actually be attacked.
+ * <p>
+ * Note: there may be other factors (invulnerability, etc) that will prevent this entity from being attacked that this event will not cover
+ */
+public class PrePlayerAttackEntityEvent extends PlayerEvent implements Cancellable {
+
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ @NotNull
+ private final Entity attacked;
+ private boolean cancelled;
+ private final boolean willAttack;
+
+ public PrePlayerAttackEntityEvent(@NotNull Player who, @NotNull Entity attacked, boolean willAttack) {
+ super(who);
+ this.attacked = attacked;
+ this.willAttack = willAttack;
+ this.cancelled = !willAttack;
+ }
+
+ /**
+ * Gets the entity that was attacked in this event.
+ * @return entity that was attacked
+ */
+ @NotNull
+ public Entity getAttacked() {
+ return this.attacked;
+ }
+
+ /**
+ * Gets if this entity will be attacked normally.
+ * Entities like falling sand will return false because
+ * their entity type does not allow them to be attacked.
+ * <p>
+ * Note: there may be other factors (invulnerability, etc) that will prevent this entity from being attacked that this event will not cover
+ * @return if the entity will actually be attacked
+ */
+ public boolean willAttack() {
+ return this.willAttack;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return this.cancelled;
+ }
+
+ /**
+ * Sets if this attack should be cancelled, note if {@link PrePlayerAttackEntityEvent#willAttack()} returns false
+ * this event will always be cancelled.
+ * @param cancel true if you wish to cancel this event
+ */
+ @Override
+ public void setCancelled(boolean cancel) {
+ if (!this.willAttack) {
+ return;
+ }
+
+ this.cancelled = cancel;
+ }
+}