aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0974-Add-PlayerShieldDisableEvent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0974-Add-PlayerShieldDisableEvent.patch')
-rw-r--r--patches/server/0974-Add-PlayerShieldDisableEvent.patch80
1 files changed, 80 insertions, 0 deletions
diff --git a/patches/server/0974-Add-PlayerShieldDisableEvent.patch b/patches/server/0974-Add-PlayerShieldDisableEvent.patch
new file mode 100644
index 0000000000..a02011827d
--- /dev/null
+++ b/patches/server/0974-Add-PlayerShieldDisableEvent.patch
@@ -0,0 +1,80 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Cryptite <[email protected]>
+Date: Mon, 1 May 2023 16:22:43 -0500
+Subject: [PATCH] Add PlayerShieldDisableEvent
+
+Called whenever a players shield is disabled. This is mainly caused by
+attacking players or monsters that carry axes.
+
+The event, while similar to the PlayerItemCooldownEvent, offers other
+behaviour and can hence not be implemented as a childtype of said event.
+Specifically, cancelling the event prevents the game events from being
+sent to the player.
+
+Plugins listening to just the PlayerItemCooldownEvent may not want said
+sideeffects, meaning the disable event cannot share a handlerlist with
+the cooldown event
+
+diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
+index 4e8aee81cb9e9fe4a4e5df4e228c0314b3af486b..544e22f569d7ddeb1ba46a9ef7f4d4d6ca37c431 100644
+--- a/src/main/java/net/minecraft/world/entity/Mob.java
++++ b/src/main/java/net/minecraft/world/entity/Mob.java
+@@ -1698,7 +1698,11 @@ public abstract class Mob extends LivingEntity implements Targeting {
+ float f = 0.25F + (float) EnchantmentHelper.getBlockEfficiency(this) * 0.05F;
+
+ if (this.random.nextFloat() < f) {
+- player.getCooldowns().addCooldown(Items.SHIELD, 100);
++ // Paper start - Add PlayerShieldDisableEvent
++ final io.papermc.paper.event.player.PlayerShieldDisableEvent shieldDisableEvent = new io.papermc.paper.event.player.PlayerShieldDisableEvent((org.bukkit.entity.Player) player.getBukkitEntity(), getBukkitEntity(), 100);
++ if (!shieldDisableEvent.callEvent()) return;
++ player.getCooldowns().addCooldown(Items.SHIELD, shieldDisableEvent.getCooldown());
++ // Paper end - Add PlayerShieldDisableEvent
+ this.level().broadcastEntityEvent(player, (byte) 30);
+ }
+ }
+diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
+index 020b74065f7489a46b70ac52e5abbdb22132f8d8..3e9c6e7e356ac08ec41736eaabf38714a8841d18 100644
+--- a/src/main/java/net/minecraft/world/entity/player/Player.java
++++ b/src/main/java/net/minecraft/world/entity/player/Player.java
+@@ -973,7 +973,7 @@ public abstract class Player extends LivingEntity {
+ protected void blockUsingShield(LivingEntity attacker) {
+ super.blockUsingShield(attacker);
+ if (attacker.canDisableShield()) {
+- this.disableShield(true);
++ this.disableShield(true, attacker); // Paper - Add PlayerShieldDisableEvent
+ }
+
+ }
+@@ -1456,7 +1456,14 @@ public abstract class Player extends LivingEntity {
+ this.attack(target);
+ }
+
++ @io.papermc.paper.annotation.DoNotUse @Deprecated // Paper - Add PlayerShieldDisableEvent
+ public void disableShield(boolean sprinting) {
++ // Paper start - Add PlayerShieldDisableEvent
++ disableShield(sprinting, null);
++ }
++
++ public void disableShield(boolean sprinting, @Nullable LivingEntity attacker) {
++ // Paper end - Add PlayerShieldDisableEvent
+ float f = 0.25F + (float) EnchantmentHelper.getBlockEfficiency(this) * 0.05F;
+
+ if (sprinting) {
+@@ -1464,7 +1471,16 @@ public abstract class Player extends LivingEntity {
+ }
+
+ if (this.random.nextFloat() < f) {
+- this.getCooldowns().addCooldown(Items.SHIELD, 100);
++ // Paper start - Add PlayerShieldDisableEvent
++ final org.bukkit.entity.Entity finalAttacker = attacker != null ? attacker.getBukkitEntity() : null;
++ if (finalAttacker != null) {
++ final io.papermc.paper.event.player.PlayerShieldDisableEvent shieldDisableEvent = new io.papermc.paper.event.player.PlayerShieldDisableEvent((org.bukkit.entity.Player) getBukkitEntity(), finalAttacker, 100);
++ if (!shieldDisableEvent.callEvent()) return;
++ this.getCooldowns().addCooldown(Items.SHIELD, shieldDisableEvent.getCooldown());
++ } else {
++ this.getCooldowns().addCooldown(Items.SHIELD, 100);
++ }
++ // Paper end - Add PlayerShieldDisableEvent
+ this.stopUsingItem();
+ this.level().broadcastEntityEvent(this, (byte) 30);
+ }