diff --git a/src/main/java/net/Indyuce/mmocore/api/event/PlayerAttributeUseEvent.java b/src/main/java/net/Indyuce/mmocore/api/event/PlayerAttributeUseEvent.java new file mode 100644 index 00000000..eb9e63b4 --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/api/event/PlayerAttributeUseEvent.java @@ -0,0 +1,22 @@ +package net.Indyuce.mmocore.api.event; + +import net.Indyuce.mmocore.api.player.PlayerData; +import org.bukkit.event.HandlerList; + +public class PlayerAttributeUseEvent extends PlayerDataEvent{ + private static final HandlerList handlers = new HandlerList(); + + public PlayerAttributeUseEvent(PlayerData playerData) { + super(playerData); + } + + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 26eb1b86..6dbeff78 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -92,16 +92,11 @@ public class PlayerData extends OfflinePlayerData { this.questData = new PlayerQuests(this); } - /* - * easily solves some issues where other plugins use PlayerData.get - */ - public static final PlayerData NOT_LOADED = new PlayerData(); - @Deprecated private PlayerData() { super(UUID.randomUUID()); - mmoData = new MMOPlayerData(null, null); + mmoData = new MMOPlayerData(); playerStats = new PlayerStats(this); questData = new PlayerQuests(this, null); } @@ -447,7 +442,7 @@ public class PlayerData extends OfflinePlayerData { * * @param value Experience to give the player * @param source How the player earned experience - * @param loc Location used to display the hologram. If it's null, no + * @param hologramLocation Location used to display the hologram. If it's null, no * hologram will be displayed */ public void giveExperience(int value, EXPSource source, @Nullable Location hologramLocation) { @@ -789,6 +784,11 @@ public class PlayerData extends OfflinePlayerData { return cast; } + @Override + public int hashCode() { + return mmoData.hashCode(); + } + @Override public boolean equals(Object obj) { return obj instanceof PlayerData && ((PlayerData) obj).getUniqueId().equals(getUniqueId()); diff --git a/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java b/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java index 25177eaf..5ece02bb 100644 --- a/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java +++ b/src/main/java/net/Indyuce/mmocore/comp/placeholder/RPGPlaceholders.java @@ -13,8 +13,6 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.attribute.Attribute; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class RPGPlaceholders extends PlaceholderExpansion { @@ -45,7 +43,7 @@ public class RPGPlaceholders extends PlaceholderExpansion { @SuppressWarnings("DuplicateExpressions") @Override - public String onRequest(@Nullable OfflinePlayer player, @NotNull String identifier) { + public String onRequest(OfflinePlayer player, String identifier) { PlayerData playerData = PlayerData.get(player); if (identifier.equals("mana_icon")) diff --git a/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java b/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java index 07fcca19..1943a3bb 100644 --- a/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java +++ b/src/main/java/net/Indyuce/mmocore/gui/AttributeView.java @@ -1,5 +1,7 @@ package net.Indyuce.mmocore.gui; +import net.Indyuce.mmocore.api.event.PlayerAttributeUseEvent; +import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.inventory.InventoryClickEvent; @@ -127,6 +129,10 @@ public class AttributeView extends EditableInventory { playerData.giveAttributePoints(-1); MMOCore.plugin.configManager.getSimpleMessage("attribute-level-up", "attribute", attribute.getName(), "level", "" + ins.getBase()).send(player); MMOCore.plugin.soundManager.play(getPlayer(), SoundManager.SoundEvent.LEVEL_ATTRIBUTE); + + PlayerAttributeUseEvent playerAttributeUseEvent = new PlayerAttributeUseEvent(playerData); + Bukkit.getServer().getPluginManager().callEvent(playerAttributeUseEvent); + open(); } } diff --git a/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java b/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java index b3bf01f5..b76518fb 100644 --- a/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java +++ b/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java @@ -12,6 +12,7 @@ import org.bukkit.event.entity.EntityRegainHealthEvent; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -20,15 +21,21 @@ import net.Indyuce.mmocore.api.event.PlayerRegenResourceEvent; import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.gui.api.PluginInventory; +import org.bukkit.scheduler.BukkitRunnable; public class PlayerListener implements Listener { - /* - * initialize player data - */ - @EventHandler(priority = EventPriority.LOW) - public void a(PlayerJoinEvent event) { - MMOCore.plugin.dataProvider.getDataManager().setup(event.getPlayer().getUniqueId()); + /* + We load our player data. + */ + @EventHandler(priority = EventPriority.NORMAL) + public void playerLoadingEvent(PlayerJoinEvent e) { + new BukkitRunnable() { + @Override + public void run() { + MMOCore.plugin.dataProvider.getDataManager().setup(e.getPlayer().getUniqueId()); + } + }.runTaskAsynchronously(MMOCore.plugin); } /* diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java b/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java index b1d895bc..656b0448 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/PlayerDataManager.java @@ -1,9 +1,6 @@ package net.Indyuce.mmocore.manager.data; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; @@ -14,9 +11,11 @@ import net.Indyuce.mmocore.api.event.PlayerDataLoadEvent; import net.Indyuce.mmocore.api.player.OfflinePlayerData; import net.Indyuce.mmocore.api.player.PlayerData; import io.lumine.mythic.lib.api.player.MMOPlayerData; +import org.bukkit.scheduler.BukkitRunnable; public abstract class PlayerDataManager { - private final static Map data = new HashMap<>(); + private final static Map data = Collections.synchronizedMap(new HashMap<>()); + private DefaultPlayerData defaultData = new DefaultPlayerData(1, 0, 0, 0, 0); public PlayerData get(OfflinePlayer player) { @@ -33,34 +32,29 @@ public abstract class PlayerDataManager { public abstract OfflinePlayerData getOffline(UUID uuid); - public PlayerData setup(UUID uuid) { - /* - * Setup playerData based on loadData method to support both MySQL and - * YAML data storage - */ - PlayerData playerData = data.get(uuid); - if (playerData == null) { - playerData = data.put(uuid, new PlayerData(MMOPlayerData.get(uuid))); + public PlayerData setup(UUID uniqueId) { + return data.compute(uniqueId, (uuid, searchData) -> { + if (searchData == null) { + PlayerData playerData = new PlayerData(MMOPlayerData.get(uniqueId)); - /* - * Loads player data and ONLY THEN refresh the player statistics and - * calls the load event on the MAIN thread - */ - Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> { - PlayerData loaded = PlayerData.get(uuid); - if (!loaded.isOnline()) - return; - loadData(loaded); - Bukkit.getScheduler().runTask(MMOCore.plugin, () -> { - if (loaded.isOnline()) - Bukkit.getPluginManager().callEvent(new PlayerDataLoadEvent(loaded)); - }); - loaded.getStats().updateStats(); - }); - } - return playerData; + loadData(playerData); + playerData.getStats().updateStats(); + + // We call the player data load event. TODO: Convert this event to async. + new BukkitRunnable() { + @Override + public void run() { + Bukkit.getPluginManager().callEvent(new PlayerDataLoadEvent(playerData)); + } + }.runTask(MMOCore.plugin); + + return playerData; + } else return searchData; + + }); } + public DefaultPlayerData getDefaultData() { return defaultData; } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f9a2404a..da4f0be8 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,7 +4,7 @@ main: net.Indyuce.mmocore.MMOCore author: Indyuce description: ${project.description} loadbefore: [MMOItems] -depend: [MMOLib] +depend: [MythicLib] softdepend: [Vault,MythicMobs,PlaceholderAPI,Residence] api-version: 1.13 commands: