Paper/patches/server/0983-Add-PlayerShieldDisableEvent.patch

81 lines
4.3 KiB
Diff
Raw Normal View History

2023-12-29 01:27:34 +01:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Cryptite <cryptite@gmail.com>
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
2024-02-10 01:07:10 +01:00
index a1ccd300791ccb3f1ef47b771e4fe33542039fea..7c5d7856a7982f0b3cad21f2cb8dde8569d2ec28 100644
2023-12-29 01:27:34 +01:00
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
2024-02-10 01:07:10 +01:00
@@ -1697,7 +1697,11 @@ public abstract class Mob extends LivingEntity implements Targeting {
2023-12-29 01:27:34 +01:00
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
2023-12-29 01:27:34 +01:00
+ 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
2023-12-29 01:27:34 +01:00
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
2024-02-01 10:15:57 +01:00
index d8ef2466e235b8121dd04bde0800ed2dbf8e370c..4f2d4ed485ce0d5f82f562281c40dc6a660e554b 100644
2023-12-29 01:27:34 +01:00
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
2024-02-01 10:15:57 +01:00
@@ -971,7 +971,7 @@ public abstract class Player extends LivingEntity {
2023-12-29 01:27:34 +01:00
protected void blockUsingShield(LivingEntity attacker) {
super.blockUsingShield(attacker);
if (attacker.canDisableShield()) {
- this.disableShield(true);
+ this.disableShield(true, attacker); // Paper - Add PlayerShieldDisableEvent
2023-12-29 01:27:34 +01:00
}
}
2024-02-01 10:15:57 +01:00
@@ -1454,7 +1454,14 @@ public abstract class Player extends LivingEntity {
2023-12-29 01:27:34 +01:00
this.attack(target);
}
2024-02-01 10:15:57 +01:00
+ @io.papermc.paper.annotation.DoNotUse @Deprecated // Paper - Add PlayerShieldDisableEvent
2023-12-29 01:27:34 +01:00
public void disableShield(boolean sprinting) {
+ // Paper start - Add PlayerShieldDisableEvent
2023-12-29 01:27:34 +01:00
+ disableShield(sprinting, null);
+ }
+
+ public void disableShield(boolean sprinting, @Nullable LivingEntity attacker) {
+ // Paper end - Add PlayerShieldDisableEvent
2023-12-29 01:27:34 +01:00
float f = 0.25F + (float) EnchantmentHelper.getBlockEfficiency(this) * 0.05F;
if (sprinting) {
2024-02-01 10:15:57 +01:00
@@ -1462,7 +1469,16 @@ public abstract class Player extends LivingEntity {
2023-12-29 01:27:34 +01:00
}
if (this.random.nextFloat() < f) {
- this.getCooldowns().addCooldown(Items.SHIELD, 100);
+ // Paper start - Add PlayerShieldDisableEvent
2023-12-29 01:27:34 +01:00
+ 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
2023-12-29 01:27:34 +01:00
this.stopUsingItem();
this.level().broadcastEntityEvent(this, (byte) 30);
}