Fixed mysql on sync

This commit is contained in:
Indyuce 2021-12-21 17:20:58 +01:00
parent 3a637d9144
commit 83739e9c66
5 changed files with 54 additions and 22 deletions

View File

@ -125,7 +125,7 @@
<dependency> <dependency>
<groupId>io.lumine</groupId> <groupId>io.lumine</groupId>
<artifactId>MythicLib</artifactId> <artifactId>MythicLib</artifactId>
<version>1.1.5</version> <version>1.1.6</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>

View File

@ -6,14 +6,13 @@ import io.lumine.mythic.lib.version.SpigotPlugin;
import io.lumine.mythic.utils.plugin.LuminePlugin; import io.lumine.mythic.utils.plugin.LuminePlugin;
import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.ConfigFile;
import net.Indyuce.mmocore.api.PlayerActionBar; import net.Indyuce.mmocore.api.PlayerActionBar;
import net.Indyuce.mmocore.comp.MMOCoreTargetRestriction;
import net.Indyuce.mmocore.loot.chest.LootChest;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource; import net.Indyuce.mmocore.api.player.profess.resource.PlayerResource;
import net.Indyuce.mmocore.api.player.social.guilds.Guild; import net.Indyuce.mmocore.api.player.social.guilds.Guild;
import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmocore.api.player.stats.StatType;
import net.Indyuce.mmocore.api.util.debug.DebugMode; import net.Indyuce.mmocore.api.util.debug.DebugMode;
import net.Indyuce.mmocore.command.*; import net.Indyuce.mmocore.command.*;
import net.Indyuce.mmocore.comp.MMOCoreTargetRestriction;
import net.Indyuce.mmocore.comp.anticheat.AntiCheatSupport; import net.Indyuce.mmocore.comp.anticheat.AntiCheatSupport;
import net.Indyuce.mmocore.comp.anticheat.SpartanPlugin; import net.Indyuce.mmocore.comp.anticheat.SpartanPlugin;
import net.Indyuce.mmocore.comp.citizens.CitizenInteractEventListener; import net.Indyuce.mmocore.comp.citizens.CitizenInteractEventListener;
@ -33,7 +32,7 @@ import net.Indyuce.mmocore.listener.*;
import net.Indyuce.mmocore.listener.option.*; import net.Indyuce.mmocore.listener.option.*;
import net.Indyuce.mmocore.listener.profession.FishingListener; import net.Indyuce.mmocore.listener.profession.FishingListener;
import net.Indyuce.mmocore.listener.profession.PlayerCollectStats; import net.Indyuce.mmocore.listener.profession.PlayerCollectStats;
import net.Indyuce.mmocore.manager.ExperienceManager; import net.Indyuce.mmocore.loot.chest.LootChest;
import net.Indyuce.mmocore.manager.*; import net.Indyuce.mmocore.manager.*;
import net.Indyuce.mmocore.manager.data.DataProvider; import net.Indyuce.mmocore.manager.data.DataProvider;
import net.Indyuce.mmocore.manager.data.mysql.MySQLDataProvider; import net.Indyuce.mmocore.manager.data.mysql.MySQLDataProvider;
@ -299,9 +298,13 @@ public class MMOCore extends LuminePlugin {
int autosave = getConfig().getInt("auto-save.interval") * 20; int autosave = getConfig().getInt("auto-save.interval") * 20;
new BukkitRunnable() { new BukkitRunnable() {
public void run() { public void run() {
for (PlayerData loaded : PlayerData.getAll())
if(loaded.isFullyLoaded()) dataProvider.getDataManager().saveData(loaded);
// Save player data
for (PlayerData data : PlayerData.getAll())
if (data.isFullyLoaded())
dataProvider.getDataManager().saveData(data);
// Save guild info
for (Guild guild : dataProvider.getGuildManager().getAll()) for (Guild guild : dataProvider.getGuildManager().getAll())
dataProvider.getGuildManager().save(guild); dataProvider.getGuildManager().save(guild);
} }
@ -310,20 +313,26 @@ public class MMOCore extends LuminePlugin {
} }
public void disable() { public void disable() {
for (PlayerData data : PlayerData.getAll()) {
if(!data.isFullyLoaded()) return;
data.getQuestData().resetBossBar();
dataProvider.getDataManager().saveData(data);
}
// Save player data
for (PlayerData data : PlayerData.getAll())
if (data.isFullyLoaded()) {
data.close();
dataProvider.getDataManager().saveData(data);
}
// Save guild info
for (Guild guild : dataProvider.getGuildManager().getAll()) for (Guild guild : dataProvider.getGuildManager().getAll())
dataProvider.getGuildManager().save(guild); dataProvider.getGuildManager().save(guild);
if(dataProvider instanceof MySQLDataProvider) // Close MySQL data provider (memory leaks)
if (dataProvider instanceof MySQLDataProvider)
((MySQLDataProvider) dataProvider).close(); ((MySQLDataProvider) dataProvider).close();
// Reset active blocks
mineManager.resetRemainingBlocks(); mineManager.resetRemainingBlocks();
// Clear spawned loot chests
lootChests.getActive().forEach(chest -> chest.unregister(false)); lootChests.getActive().forEach(chest -> chest.unregister(false));
} }

View File

@ -153,6 +153,11 @@ public class PlayerQuests implements Closable {
@Override @Override
public void close() { public void close() {
// Remove boss bar
bossbar.removeAll();
// Close current objective progress
if (current != null) if (current != null)
current.getProgress().close(); current.getProgress().close();
} }
@ -183,8 +188,4 @@ public class PlayerQuests implements Closable {
bossbar.setTitle(current.getFormattedLore()); bossbar.setTitle(current.getFormattedLore());
bossbar.setProgress((double) current.getObjectiveNumber() / current.getQuest().getObjectives().size()); bossbar.setProgress((double) current.getObjectiveNumber() / current.getQuest().getObjectives().size());
} }
public void resetBossBar() {
bossbar.removeAll();
}
} }

View File

@ -4,16 +4,19 @@ import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.api.util.AltChar; import io.lumine.mythic.lib.api.util.AltChar;
import me.clip.placeholderapi.expansion.PlaceholderExpansion; import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.experience.PlayerProfessions;
import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmocore.api.player.stats.StatType;
import net.Indyuce.mmocore.api.quest.PlayerQuests; import net.Indyuce.mmocore.api.quest.PlayerQuests;
import net.Indyuce.mmocore.experience.PlayerProfessions;
import net.Indyuce.mmocore.experience.Profession;
import net.Indyuce.mmocore.skill.Skill;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import java.util.Objects;
public class RPGPlaceholders extends PlaceholderExpansion { public class RPGPlaceholders extends PlaceholderExpansion {
@Override @Override
@ -56,6 +59,12 @@ public class RPGPlaceholders extends PlaceholderExpansion {
if (identifier.equals("level")) if (identifier.equals("level"))
return "" + playerData.getLevel(); return "" + playerData.getLevel();
else if (identifier.startsWith("skill_level_")) {
String id = identifier.substring(12);
Skill skill = Objects.requireNonNull(MMOCore.plugin.skillManager.get(id), "Could not find skill with ID '" + id + "'");
return String.valueOf(playerData.getSkillLevel(skill));
}
else if (identifier.equals("level_percent")) { else if (identifier.equals("level_percent")) {
double current = playerData.getExperience(), next = playerData.getLevelUpExperience(); double current = playerData.getExperience(), next = playerData.getLevelUpExperience();
return MythicLib.plugin.getMMOConfig().decimal.format(current / next * 100); return MythicLib.plugin.getMMOConfig().decimal.format(current / next * 100);

View File

@ -42,11 +42,22 @@ public abstract class PlayerDataManager {
* @param playerData PLayer data to unregister * @param playerData PLayer data to unregister
*/ */
public void unregisterSafe(PlayerData playerData) { public void unregisterSafe(PlayerData playerData) {
if (playerData.isFullyLoaded())
saveData(playerData);
playerData.close(); // Save data async if required
this.data.remove(playerData.getUniqueId()); if (playerData.isFullyLoaded())
Bukkit.getScheduler().runTaskAsynchronously(MMOCore.plugin, () -> {
saveData(playerData);
// Unregister once the data was saved
playerData.close();
this.data.remove(playerData.getUniqueId());
});
// Just unregister data without saving
else {
playerData.close();
this.data.remove(playerData.getUniqueId());
}
} }
/** /**
@ -120,6 +131,8 @@ public abstract class PlayerDataManager {
/** /**
* Called when player data must be saved in configs or database. * Called when player data must be saved in configs or database.
* This method should always be called sync because it DOES register
* an async task in case MySQL storage is used.
* *
* @param data Player data to save * @param data Player data to save
*/ */