diff --git a/patches/api/0343-Add-player-health-update-API.patch b/patches/api/0343-Add-player-health-update-API.patch new file mode 100644 index 0000000000..ea5b3602ac --- /dev/null +++ b/patches/api/0343-Add-player-health-update-API.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: SamB440 +Date: Wed, 17 Nov 2021 12:30:36 +0000 +Subject: [PATCH] Add player health update API + + +diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java +index 7907ed07a33557f1011ff8df2a411c6d161e3fda..46357e74bce88c152d4e12e4078fd6ba71deeef7 100644 +--- a/src/main/java/org/bukkit/entity/Player.java ++++ b/src/main/java/org/bukkit/entity/Player.java +@@ -1583,6 +1583,31 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM + */ + public double getHealthScale(); + ++ // Paper start ++ /** ++ * Forcefully sends a health update to the player. ++ *

This method can cause the client to display health values ++ * different to their true server values. If the player takes damage or ++ * causes an action to otherwise cause a health update, these values ++ * will no longer be shown.

++ * Setting the visible health to 0 will result in the client seeing ++ * the death screen, unable to press the respawn button. ++ * @see #sendHealthUpdate() ++ * @param health the health of the player ++ * @param foodLevel the food level of the player ++ * @param saturationLevel the saturation level of the player ++ */ ++ public void sendHealthUpdate(final double health, final int foodLevel, final float saturationLevel); ++ ++ /** ++ * Forcefully sends a health update to the player. ++ * This uses the player's current health, saturation, and food level. ++ *

Use after {@link #setHealth(double)} to show the heart animation ++ * of gaining or losing health.

++ */ ++ public void sendHealthUpdate(); ++ // Paper end ++ + /** + * Gets the entity which is followed by the camera when in + * {@link GameMode#SPECTATOR}. diff --git a/patches/server/0821-Add-player-health-update-API.patch b/patches/server/0821-Add-player-health-update-API.patch new file mode 100644 index 0000000000..f15994be88 --- /dev/null +++ b/patches/server/0821-Add-player-health-update-API.patch @@ -0,0 +1,39 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: SamB440 +Date: Wed, 17 Nov 2021 12:31:42 +0000 +Subject: [PATCH] Add player health update API + + +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index c6c742e541e6bb5214e3c2c245bbe5988f7c2b41..05352929a9652f3b857b7888f42eef2059842739 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -1980,9 +1980,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + this.getHandle().maxHealthCache = getMaxHealth(); + } + +- public void sendHealthUpdate() { ++ // Paper start ++ @Override ++ public void sendHealthUpdate(final double health, final int foodLevel, final float saturationLevel) { + // Paper start - cancellable death event +- ClientboundSetHealthPacket packet = new ClientboundSetHealthPacket(this.getScaledHealth(), this.getHandle().getFoodData().getFoodLevel(), this.getHandle().getFoodData().getSaturationLevel()); ++ ClientboundSetHealthPacket packet = new ClientboundSetHealthPacket((float) health, foodLevel, saturationLevel); + if (this.getHandle().queueHealthUpdatePacket) { + this.getHandle().queuedHealthUpdatePacket = packet; + } else { +@@ -1990,7 +1992,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + } + // Paper end + } +- ++ ++ @Override ++ public void sendHealthUpdate() { ++ this.sendHealthUpdate(this.getScaledHealth(), this.getHandle().getFoodData().getFoodLevel(), this.getHandle().getFoodData().getSaturationLevel()); ++ } ++ // Paper end ++ + public void injectScaledMaxHealth(Collection collection, boolean force) { + if (!this.scaledHealth && !force) { + return;