Paper/patches/api/0394-Add-PrePlayerAttackEntityEvent.patch
Jake Potrebic 5730a94208
Updated Upstream (Bukkit/CraftBukkit) (#8991)
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:
2b4582fb SPIGOT-5916: getLastColors does not work with the rgb colors

CraftBukkit Changes:
f7707086d SPIGOT-7299: Fix indirect/anvil damage events and minor improvements
2023-03-18 10:05:04 -07: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;
+ }
+}