Don't resync all attributes when updating scaled health (#12232)

This commit is contained in:
Tamion 2025-03-08 21:31:21 +01:00 committed by GitHub
parent 2526fe063a
commit 20df25d3a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2827,14 +2827,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
} }
public void updateScaledHealth(boolean sendHealth) { public void updateScaledHealth(boolean sendHealth) {
AttributeMap attributemapserver = this.getHandle().getAttributes();
Collection<AttributeInstance> set = attributemapserver.getSyncableAttributes();
this.injectScaledMaxHealth(set, true);
// SPIGOT-3813: Attributes before health // SPIGOT-3813: Attributes before health
if (this.getHandle().connection != null) { if (this.getHandle().connection != null) {
this.getHandle().connection.send(new ClientboundUpdateAttributesPacket(this.getHandle().getId(), set)); this.getHandle().connection.send(new ClientboundUpdateAttributesPacket(this.getHandle().getId(), Set.of(this.getScaledMaxHealth())));
if (sendHealth) { if (sendHealth) {
this.sendHealthUpdate(); this.sendHealthUpdate();
} }
@ -2874,8 +2869,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
break; break;
} }
} }
collection.add(getScaledMaxHealth());
}
public AttributeInstance getScaledMaxHealth() {
AttributeInstance dummy = new AttributeInstance(Attributes.MAX_HEALTH, (attribute) -> { }); AttributeInstance dummy = new AttributeInstance(Attributes.MAX_HEALTH, (attribute) -> { });
// Spigot start
double healthMod = this.scaledHealth ? this.healthScale : this.getMaxHealth(); double healthMod = this.scaledHealth ? this.healthScale : this.getMaxHealth();
if ( healthMod >= Float.MAX_VALUE || healthMod <= 0 ) if ( healthMod >= Float.MAX_VALUE || healthMod <= 0 )
{ {
@ -2883,8 +2881,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
this.getServer().getLogger().warning( this.getName() + " tried to crash the server with a large health attribute" ); this.getServer().getLogger().warning( this.getName() + " tried to crash the server with a large health attribute" );
} }
dummy.setBaseValue(healthMod); dummy.setBaseValue(healthMod);
// Spigot end return dummy;
collection.add(dummy);
} }
@Override @Override