mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-30 06:24:06 +01:00
76ee105811
HashMapPalette uses an instance of CrudeIncrementalIntIdentityHashBiMap internally. A Palette has a preset maximum size = 1 << bits. CrudeIncrementalIntIdentityHashBiMap has an initial size but is automatically resized. The CrudeIncrementalIntIdentityHashBiMap is created with the maximum size in the constructor of HashMapPalette, with the aim that it doesn't need to be resized anymore. However, there are two things that I think Mojang hasn't considered here: 1) The CrudeIncrementalIntIdentityHashBiMap is resized, when its initial size is reached and not the next time, when a further object is added. 2) HashMapPalette adds objects (unnecessarily) before checking if the initial size of CrudeIncrementalIntIdentityHashBiMap is reached. This means to actually avoid resize operations in CrudeIncrementalIntIdentityHashBiMap, one has to add 2 to the initial size or add 1 and check the size before adding objects. This commit implements the second approach. Note that this isn't only an optimization but also makes async reads of Palettes fail-safe. An async read while the CrudeIncrementalIntIdentityHashBiMap is resized is fatal and can even lead to corrupted data. This is also something that Anti-Xray is currently relying on.
43 lines
1.8 KiB
Diff
43 lines
1.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: SamB440 <sam@islandearth.net>
|
|
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.
|
|
+ * <p>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.</p>
|
|
+ * 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.
|
|
+ * <p>Use after {@link #setHealth(double)} to show the heart animation
|
|
+ * of gaining or losing health.</p>
|
|
+ */
|
|
+ public void sendHealthUpdate();
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Gets the entity which is followed by the camera when in
|
|
* {@link GameMode#SPECTATOR}.
|