From 991397606ffc28d783e91832fc3f353aaa6ed77b Mon Sep 17 00:00:00 2001 From: Jules Date: Thu, 18 Apr 2024 15:15:24 -0700 Subject: [PATCH] Fixed MMOInv health buffs not working on login --- .../mmocore/api/player/PlayerData.java | 31 ++++------------ .../mmocore/listener/PlayerListener.java | 35 +++++++++++++++++-- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 1af1dc81..df37d21d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -178,30 +178,6 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD getStats().updateStats(); } - /** - * This script is called when the player data has been successfully - * loaded from the SQL/local text database. - */ - @Override - public void markAsSynchronized() { - setupSkillTree(); - applyTemporaryTriggers(); - getStats().updateStats(true); - - /* - * If the player is not dead and the health is 0, this means that the data was - * missing from the database and it gives full health to the player. If the - * player is dead however, it must not account for that subtle edge case. - */ - if (isOnline() && !getPlayer().isDead()) { - final double effectiveHealth = Math.max(getPlayer().getHealth(), getHealth()); - getPlayer().setHealth(MMOCoreUtils.fixResource(effectiveHealth, getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); - } - - // Finally mark synchronized - super.markAsSynchronized(); - } - @Deprecated public void setupRemovableTrigger() { applyTemporaryTriggers(); @@ -999,9 +975,10 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD stellium = Math.max(0, Math.min(stellium + event.getAmount(), max)); } + @Deprecated @Override public double getHealth() { - return isSynchronized() && isOnline() ? getPlayer().getHealth() : health; + return isOnline() ? getPlayer().getHealth() : health; } @Override @@ -1018,6 +995,10 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD return stellium; } + public double getCachedHealth() { + return health; + } + public PlayerStats getStats() { return playerStats; } diff --git a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java index 0e7d9faa..32cd9c20 100644 --- a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java +++ b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java @@ -1,15 +1,17 @@ - package net.Indyuce.mmocore.listener; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.event.PlayerAttackEvent; +import io.lumine.mythic.lib.api.event.SynchronizedDataLoadEvent; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; +import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.gui.api.InventoryClickContext; import net.Indyuce.mmocore.gui.api.PluginInventory; import org.bukkit.Bukkit; +import org.bukkit.attribute.Attribute; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -22,6 +24,35 @@ import org.bukkit.event.inventory.InventoryCloseEvent; public class PlayerListener implements Listener { + /** + * Script ran when the full MMO plugin data is synchronized. Player Health + * is only updated now otherwise other MMO plugins would not have the time + * to register their stats beforehand. + */ + @EventHandler(priority = EventPriority.HIGHEST) + public void a(SynchronizedDataLoadEvent event) { + if (event.syncIsFull()) { + final PlayerData playerData = PlayerData.get(event.getHolder().getUniqueId()); + final Player player = playerData.getPlayer(); + + playerData.setupSkillTree(); + playerData.applyTemporaryTriggers(); + playerData.getStats().updateStats(true); // TODO maybe duplicate? + + /* + * If the player is not dead and the health is 0, this means that the data was + * missing from the database, and it should give full health to the player. It + * must account for the edge case where the player is dead. + */ + if (playerData.isOnline() && !player.isDead()) { + final double cachedHealth = playerData.getCachedHealth(), + maxHealth = player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(), + fixedHealth = MMOCoreUtils.fixResource(cachedHealth, maxHealth); + player.setHealth(fixedHealth); + } + } + } + /** * Register custom inventory clicks */ @@ -54,7 +85,7 @@ public class PlayerListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void updateCombat(EntityDamageEvent event) { - if (UtilityMethods.isFakeEvent(event)) return; + if (UtilityMethods.isFake(event)) return; if (UtilityMethods.isRealPlayer(event.getEntity()) && MMOCore.plugin.configManager.combatLogDamageCauses.contains(event.getCause())) PlayerData.get((Player) event.getEntity()).getCombat().update(); }