diff --git a/MMOItems-API/pom.xml b/MMOItems-API/pom.xml
index 19a272b4..d6ce2d8f 100644
--- a/MMOItems-API/pom.xml
+++ b/MMOItems-API/pom.xml
@@ -174,6 +174,14 @@
5.1.2-SNAPSHOT
provided
+
+
+ fr.phoenixdevt
+ Profile-API
+ 1.0-SNAPSHOT
+ provided
+ true
+
com.sk89q.worldguard
diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/MMOItems.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/MMOItems.java
index 3ae11891..55b5fd66 100644
--- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/MMOItems.java
+++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/MMOItems.java
@@ -37,6 +37,7 @@ import net.Indyuce.mmoitems.comp.rpg.RPGHandler;
import net.Indyuce.mmoitems.gui.PluginInventory;
import net.Indyuce.mmoitems.gui.edition.recipe.RecipeBrowserGUI;
import net.Indyuce.mmoitems.manager.*;
+import net.Indyuce.mmoitems.manager.data.PlayerDataManager;
import net.Indyuce.mmoitems.util.PluginUtils;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
@@ -44,6 +45,7 @@ import org.bukkit.ChatColor;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
+import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
@@ -76,6 +78,7 @@ public class MMOItems extends JavaPlugin {
private final List> enchantPlugins = new ArrayList<>();
private final StatManager statManager = new StatManager();
+ private PlayerDataManager playerDataManager;
private DropTableManager dropTableManager;
private WorldGenManager worldGenManager;
private UpgradeManager upgradeManager;
@@ -239,7 +242,8 @@ public class MMOItems extends JavaPlugin {
}*/
// Compatibility with /reload
- Bukkit.getScheduler().runTask(this, () -> Bukkit.getOnlinePlayers().forEach(PlayerData::load));
+ playerDataManager = new PlayerDataManager();
+ playerDataManager.initialize(true, EventPriority.NORMAL, EventPriority.HIGHEST);
// Amount and bukkit recipes
getLogger().log(Level.INFO, "Loading recipes, please wait...");
@@ -261,7 +265,7 @@ public class MMOItems extends JavaPlugin {
return;
// Save player data
- PlayerData.getLoaded().forEach(data -> data.save(false));
+ playerDataManager.saveAll(false);
// Drop abandoned items
DeathItemsHandler.getActive().forEach(info -> info.giveItems(true));
@@ -435,6 +439,10 @@ public class MMOItems extends JavaPlugin {
enchantPlugins.add(enchantPlugin);
}
+ public PlayerDataManager getPlayerDataManager() {
+ return playerDataManager;
+ }
+
public StatManager getStats() {
return statManager;
}
diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/player/PlayerData.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/player/PlayerData.java
index 1644f1ef..37d95703 100644
--- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/player/PlayerData.java
+++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/player/PlayerData.java
@@ -5,13 +5,14 @@ import io.lumine.mythic.lib.api.item.NBTItem;
import io.lumine.mythic.lib.api.player.EquipmentSlot;
import io.lumine.mythic.lib.api.player.MMOPlayerData;
import io.lumine.mythic.lib.damage.AttackMetadata;
+import io.lumine.mythic.lib.data.SynchronizedDataHolder;
import io.lumine.mythic.lib.player.PlayerMetadata;
import io.lumine.mythic.lib.player.modifier.ModifierSource;
import io.lumine.mythic.lib.player.skill.PassiveSkill;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
+import io.lumine.mythic.lib.util.Closeable;
import net.Indyuce.mmoitems.ItemStats;
import net.Indyuce.mmoitems.MMOItems;
-import net.Indyuce.mmoitems.api.ConfigFile;
import net.Indyuce.mmoitems.api.ItemSet;
import net.Indyuce.mmoitems.api.ItemSet.SetBonuses;
import net.Indyuce.mmoitems.api.crafting.CraftingStatus;
@@ -28,7 +29,6 @@ import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block;
-import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
@@ -39,7 +39,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.*;
-public class PlayerData {
+public class PlayerData extends SynchronizedDataHolder implements Closeable {
@NotNull
private final MMOPlayerData mmoData;
@@ -59,44 +59,17 @@ public class PlayerData {
private final PlayerStats stats;
private final Set permissions = new HashSet<>();
- private static final Map data = new HashMap<>();
+ public PlayerData(@NotNull MMOPlayerData mmoData) {
+ super(mmoData);
- private PlayerData(@NotNull MMOPlayerData mmoData) {
this.mmoData = mmoData;
rpgPlayer = MMOItems.plugin.getMainRPG().getInfo(this);
stats = new PlayerStats(this);
-
- load(new ConfigFile("/userdata", getUniqueId().toString()).getConfig());
}
- private void load(FileConfiguration config) {
- if (config.contains("crafting-queue"))
- craftingStatus.load(this, config.getConfigurationSection("crafting-queue"));
-
- if (MMOItems.plugin.hasPermissions() && config.contains("permissions-from-items")) {
- final Permission perms = MMOItems.plugin.getVault().getPermissions();
- config.getStringList("permissions-from-items").forEach(perm -> {
- if (perms.has(getPlayer(), perm))
- perms.playerRemove(getPlayer(), perm);
- });
- }
- }
-
- public void save(boolean clearForMap) {
-
- // Empty map if required
- if (clearForMap)
- data.remove(getUniqueId());
-
- // Cancel runnables
+ @Override
+ public void close() {
cancelRunnables();
-
- // Save data in config
- final ConfigFile config = new ConfigFile("/userdata", getUniqueId().toString());
- config.getConfig().createSection("crafting-queue");
- config.getConfig().set("permissions-from-items", new ArrayList<>(permissions));
- craftingStatus.save(config.getConfig().getConfigurationSection("crafting-queue"));
- config.save();
}
public MMOPlayerData getMMOPlayerData() {
@@ -132,7 +105,7 @@ public class PlayerData {
/**
* @return If the player hands are full i.e if the player is holding
- * two items in their hands, one being two handed
+ * two items in their hands, one being two handed
*/
public boolean isEncumbered() {
@@ -260,7 +233,7 @@ public class PlayerData {
// Calculate the player's item set
final Map itemSetCount = new HashMap<>();
for (EquippedItem equipped : inventory.getEquipped()) {
- final String tag = equipped.getCached().getNBT().getString("MMOITEMS_ITEM_SET");
+ final String tag = equipped.getCached().getNBT().getString("MMOITEMS_ITEM_SET");
final @Nullable ItemSet itemSet = MMOItems.plugin.getSets().get(tag);
if (itemSet == null)
continue;
@@ -346,6 +319,10 @@ public class PlayerData {
return permanentEffects.containsKey(type) ? permanentEffects.get(type).getAmplifier() : -1;
}
+ public Set getPermissions() {
+ return permissions;
+ }
+
public Collection getPermanentPotionEffects() {
return permanentEffects.values();
}
@@ -424,49 +401,18 @@ public class PlayerData {
* @return If player data is loaded for a player UUID
*/
public static boolean has(UUID uuid) {
- return data.containsKey(uuid);
+ return MMOItems.plugin.getPlayerDataManager().isLoaded(uuid);
}
@NotNull
public static PlayerData get(UUID uuid) {
- return Objects.requireNonNull(data.get(uuid), "Player data not loaded");
- }
-
- /**
- * Called when the corresponding MMOPlayerData has already been initialized.
- */
- public static @NotNull PlayerData load(@NotNull Player player) {
- return load(player.getUniqueId());
- }
-
- /**
- * Called when the corresponding MMOPlayerData has already been initialized.
- */
- public static PlayerData load(@NotNull UUID player) {
-
- /*
- * Double check they are online, for some reason even if this is fired
- * from the join event the player can be offline if they left in the
- * same tick or something.
- */
- if (!data.containsKey(player)) {
- PlayerData playerData = new PlayerData(MMOPlayerData.get(player));
- data.put(player, playerData);
- playerData.getInventory().scheduleUpdate();
- return playerData;
- }
-
- /*
- * Update the cached RPGPlayer in case of any major change in the player
- * data of other rpg plugins
- */
- PlayerData playerData = data.get(player);
- playerData.rpgPlayer = MMOItems.plugin.getMainRPG().getInfo(playerData);
- return playerData;
+ return MMOItems.plugin.getPlayerDataManager().get(uuid);
}
+ @Deprecated
+ @NotNull
public static Collection getLoaded() {
- return data.values();
+ return MMOItems.plugin.getPlayerDataManager().getLoaded();
}
public enum CooldownType {
diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/data/PlayerDataManager.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/data/PlayerDataManager.java
new file mode 100644
index 00000000..a7a7dcd3
--- /dev/null
+++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/data/PlayerDataManager.java
@@ -0,0 +1,25 @@
+package net.Indyuce.mmoitems.manager.data;
+
+import io.lumine.mythic.lib.api.player.MMOPlayerData;
+import io.lumine.mythic.lib.comp.profile.DefaultProfileDataModule;
+import io.lumine.mythic.lib.data.DefaultOfflineDataHolder;
+import io.lumine.mythic.lib.data.SynchronizedDataManager;
+import net.Indyuce.mmoitems.MMOItems;
+import net.Indyuce.mmoitems.api.player.PlayerData;
+import org.jetbrains.annotations.NotNull;
+
+public class PlayerDataManager extends SynchronizedDataManager {
+ public PlayerDataManager() {
+ super(MMOItems.plugin, new YAMLDataHandler());
+ }
+
+ @Override
+ public PlayerData newPlayerData(@NotNull MMOPlayerData mmoPlayerData) {
+ return new PlayerData(mmoPlayerData);
+ }
+
+ @Override
+ public Object newProfileDataModule() {
+ return new DefaultProfileDataModule(MMOItems.plugin);
+ }
+}
diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/data/YAMLDataHandler.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/data/YAMLDataHandler.java
new file mode 100644
index 00000000..78e1ffbf
--- /dev/null
+++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/manager/data/YAMLDataHandler.java
@@ -0,0 +1,54 @@
+package net.Indyuce.mmoitems.manager.data;
+
+import io.lumine.mythic.lib.data.DefaultOfflineDataHolder;
+import io.lumine.mythic.lib.data.yaml.YAMLSynchronizedDataHandler;
+import net.Indyuce.mmoitems.MMOItems;
+import net.Indyuce.mmoitems.api.player.PlayerData;
+import net.milkbowl.vault.permission.Permission;
+import org.bukkit.configuration.ConfigurationSection;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.UUID;
+
+public class YAMLDataHandler extends YAMLSynchronizedDataHandler {
+ public YAMLDataHandler() {
+ super(MMOItems.plugin);
+ }
+
+ @Override
+ public void saveInSection(PlayerData playerData, ConfigurationSection config) {
+ config.createSection("crafting-queue");
+ config.set("permissions-from-items", new ArrayList<>(playerData.getPermissions()));
+ playerData.getCrafting().save(config.getConfigurationSection("crafting-queue"));
+ }
+
+ @Override
+ public void loadFromSection(PlayerData playerData, ConfigurationSection config) {
+
+ if (config.contains("crafting-queue"))
+ playerData.getCrafting().load(playerData, config.getConfigurationSection("crafting-queue"));
+
+ if (MMOItems.plugin.hasPermissions() && config.contains("permissions-from-items")) {
+ final Permission perms = MMOItems.plugin.getVault().getPermissions();
+ config.getStringList("permissions-from-items").forEach(perm -> {
+ if (perms.has(playerData.getPlayer(), perm)) perms.playerRemove(playerData.getPlayer(), perm);
+ });
+ }
+ }
+
+ @Override
+ public void setup() {
+ // Nothing
+ }
+
+ @Override
+ public DefaultOfflineDataHolder getOffline(@NotNull UUID uuid) {
+ return new DefaultOfflineDataHolder(uuid);
+ }
+
+ @Override
+ public void close() {
+ // Nothing
+ }
+}
diff --git a/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/listener/PlayerListener.java b/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/listener/PlayerListener.java
index 8d3dbf5e..7005d6b8 100644
--- a/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/listener/PlayerListener.java
+++ b/MMOItems-Dist/src/main/java/net/Indyuce/mmoitems/listener/PlayerListener.java
@@ -11,7 +11,6 @@ import net.Indyuce.mmoitems.api.interaction.util.InteractItem;
import net.Indyuce.mmoitems.api.interaction.weapon.Weapon;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.util.DeathDowngrading;
-import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.entity.Trident;
@@ -20,30 +19,17 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
-import org.bukkit.event.player.*;
+import org.bukkit.event.player.PlayerItemHeldEvent;
+import org.bukkit.event.player.PlayerRespawnEvent;
+import org.bukkit.event.player.PlayerSwapHandItemsEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
-import java.util.*;
+import java.util.Iterator;
public class PlayerListener implements Listener {
- /**
- * MythicLib runs of LOWEST
- * MMOCore and MMOInventory runs on LOW
- */
- @EventHandler(priority = EventPriority.NORMAL)
- public void loadPlayerData(PlayerJoinEvent event) {
- MMOItems.plugin.getRecipes().refreshRecipeBook(event.getPlayer());
- PlayerData.load(event.getPlayer());
- }
-
- @EventHandler(priority = EventPriority.HIGHEST)
- public void savePlayerData(PlayerQuitEvent event) {
- PlayerData.get(event.getPlayer()).save(true);
- }
-
/**
* If the player dies, its time to roll the death-downgrade stat!
*/