From 21471b8c48846184ed63164d4ff16ae2478c8fe3 Mon Sep 17 00:00:00 2001 From: Irmo van den Berge Date: Tue, 14 Feb 2023 19:02:45 +0100 Subject: [PATCH] Add a fallback impl for if the setAbsorptionAmount bkcl API isn't available --- .../bukkit/mw/MWPlayerDataController.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/bergerkiller/bukkit/mw/MWPlayerDataController.java b/src/main/java/com/bergerkiller/bukkit/mw/MWPlayerDataController.java index 031401f..b2f0168 100644 --- a/src/main/java/com/bergerkiller/bukkit/mw/MWPlayerDataController.java +++ b/src/main/java/com/bergerkiller/bukkit/mw/MWPlayerDataController.java @@ -8,6 +8,7 @@ import java.util.function.Consumer; import java.util.logging.Level; +import com.bergerkiller.mountiplex.reflection.resolver.Resolver; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.GameMode; @@ -545,9 +546,26 @@ public void refreshState(Player player) { player.setFireTicks(playerData.getValue("Fire", (short) 0)); player.setFallDistance(playerData.getValue("FallDistance", 0.0f)); + float absorptionAmount = playerData.getValue("AbsorptionAmount", 0.0f); try { - playerHandle.setAbsorptionAmount(playerData.getValue("AbsorptionAmount", 0.0f)); - } catch (Throwable t) { /* Until BKCL 1.19.3-v2 is a hard-dep, we need this. */ } + playerHandle.setAbsorptionAmount(absorptionAmount); + } catch (Throwable t) { + /* Until BKCL 1.19.3-v2 is a hard-dep, we need this. */ + try { + java.lang.reflect.Method m; + if (Common.evaluateMCVersion(">=", "1.18")) { + m = Resolver.resolveAndGetDeclaredMethod(EntityLivingHandle.T.getType(), + "setAbsorptionAmount", float.class); + } else { + m = Resolver.resolveAndGetDeclaredMethod(EntityLivingHandle.T.getType(), + "setAbsorptionHearts", float.class); + } + m.setAccessible(true); + m.invoke(playerHandle.getRaw(), absorptionAmount); + } catch (Throwable t2) { + plugin.getLogger().log(Level.WARNING, "Failed to apply absorption. Update BKCL?", t2); + } + } { final double maxHealth = commonPlayer.getMaxHealth();