diff --git a/Plugins/Mineplex.Core/src/mineplex/core/MiniClientPlugin.java b/Plugins/Mineplex.Core/src/mineplex/core/MiniClientPlugin.java index 1c2ed3b52..0b93c0fd2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/MiniClientPlugin.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/MiniClientPlugin.java @@ -32,7 +32,7 @@ public abstract class MiniClientPlugin extends MiniPlugin { synchronized (_clientDataLock) { - saveData(event.GetName(), event.getAccountId()); + saveData(event.GetName(), event.getUniqueId(), event.getAccountId()); _clientData.remove(event.getUniqueId()); } } @@ -57,7 +57,7 @@ public abstract class MiniClientPlugin extends MiniPlugin } } - public void saveData(String name, int accountId) {} + public void saveData(String name, UUID uuid, int accountId) {} public DataType Get(Player player) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/quests/QuestManager.java b/Plugins/Mineplex.Core/src/mineplex/core/quests/QuestManager.java index 89b43b2d8..f07b5d6de 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/quests/QuestManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/quests/QuestManager.java @@ -387,11 +387,10 @@ public class QuestManager extends MiniDbClientPlugin return new QuestClientData(); } - @SuppressWarnings("deprecation") @Override - public void saveData(String name, int accountId) + public void saveData(String name, UUID uuid, int accountId) { - Hologram hologram = Get(name).getHologram(); + Hologram hologram = Get(uuid).getHologram(); if (hologram != null) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/PlayerStats.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/PlayerStats.java index 8b4297e50..187ab1f9d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/PlayerStats.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/PlayerStats.java @@ -13,6 +13,18 @@ public class PlayerStats private Map _stats = new HashMap<>(); private Map _statsOld = new HashMap<>(); + + private final boolean _temporary; + + public PlayerStats(boolean temporary) + { + _temporary = temporary; + } + + public boolean isTemporary() + { + return _temporary; + } /** * Add a value to the specified stat diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 8b3eaebdd..8544a4e21 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -1,7 +1,6 @@ package mineplex.core.stats; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -13,13 +12,14 @@ import java.util.function.Consumer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; -import mineplex.core.MiniDbClientPlugin; +import mineplex.core.MiniClientPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; -import mineplex.core.account.ILoginProcessor; import mineplex.core.account.permissions.Permission; import mineplex.core.account.permissions.PermissionGroup; import mineplex.core.common.util.UtilServer; @@ -35,7 +35,7 @@ import mineplex.core.utils.UtilScheduler; /** * This manager handles player statistics */ -public class StatsManager extends MiniDbClientPlugin +public class StatsManager extends MiniClientPlugin//MiniDbClientPlugin { public enum Perm implements Permission { @@ -54,17 +54,20 @@ public class StatsManager extends MiniDbClientPlugin private final Map _stats = new HashMap<>(); private final Map> _statUploadQueue = new HashMap<>(); private final Map> _statUploadQueueOverRidable = new HashMap<>(); + + private final Set _loading = Collections.synchronizedSet(new HashSet<>()); public StatsManager(JavaPlugin plugin, CoreClientManager clientManager) { - super("Stats Manager", plugin, clientManager); - + //super("Stats Manager", plugin, clientManager); + super("Stats Manager", plugin); + _repository = new StatsRepository(); _coreClientManager = clientManager; _leaderboard = new LeaderboardManager(this); - clientManager.addStoredProcedureLoginProcessor(new ILoginProcessor() + /*clientManager.addStoredProcedureLoginProcessor(new ILoginProcessor() { public String getName() { @@ -87,7 +90,7 @@ public class StatsManager extends MiniDbClientPlugin { return "SELECT stats.name, value FROM accountStat INNER JOIN stats ON stats.id = accountStat.statId WHERE accountStat.accountId = '" + accountId + "';"; } - }); + });*/ UtilScheduler.runAsyncEvery(UpdateType.SEC, () -> { @@ -164,14 +167,20 @@ public class StatsManager extends MiniDbClientPlugin { if (value < 0) return; - - CoreClient client = _coreClientManager.Get(player); - long oldCompositeValue = Get(player).getStat(statName); - long oldValue = Get(player).getJustCurrentStat(statName); - long oldOldValue = Get(player).getStatOld(statName); + CoreClient client = _coreClientManager.Get(player); + PlayerStats snapshot = Get(player); + + if (snapshot.isTemporary()) + { + return; + } + + long oldCompositeValue = snapshot.getStat(statName); + long oldValue = snapshot.getJustCurrentStat(statName); + long oldOldValue = snapshot.getStatOld(statName); final long incrementBy = value + (oldOldValue > oldValue ? (oldOldValue - oldValue) : 0L); - long newValue = Get(player).addStat(statName, incrementBy); + long newValue = snapshot.addStat(statName, incrementBy); UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player, statName, oldCompositeValue, newValue)); registerNewStat(statName, () -> addToQueue(statName, client, incrementBy)); @@ -371,23 +380,31 @@ public class StatsManager extends MiniDbClientPlugin @EventHandler private void onPlayerJoin(PlayerJoinEvent event) { - Set statsToReset = new HashSet<>(); - - Get(event.getPlayer()).getStats().forEach((stat, amount) -> + final UUID uuid = event.getPlayer().getUniqueId(); + final int accountId = _coreClientManager.Get(event.getPlayer()).getAccountId(); + runAsync(() -> { - if (!_stats.containsKey(stat)) - return; - - if (amount == -1) + _repository.loadStatsFromOld(accountId, data -> { - statsToReset.add(stat); - } - }); - - statsToReset.forEach(stat -> - { - setStat(event.getPlayer(), stat, 0); - }); + PlayerStats stats = new PlayerStats(false); + data.forEach((stat, values) -> + { + stats.addStat(stat, values.getRight()); + stats.setStatOld(stat, values.getLeft()); + }); + + if (_loading.remove(uuid)) + { + Set(uuid, stats); + } + }); + }, 5000); //Load 5 seconds later + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onLogin(AsyncPlayerPreLoginEvent event) + { + _loading.add(event.getUniqueId()); } @Override @@ -402,10 +419,26 @@ public class StatsManager extends MiniDbClientPlugin @Override protected PlayerStats addPlayer(UUID uuid) { - return new PlayerStats(); + return new PlayerStats(false); + } + + @Override + public PlayerStats Get(UUID uuid) + { + if (_loading.contains(uuid)) + { + return new PlayerStats(true); + } + return super.Get(uuid); + } + + @Override + public void saveData(String name, UUID uuid, int accountId) + { + _loading.remove(uuid); } - @Override +/* @Override public void processLoginResultSet(String playerName, UUID uuid, int accountId, ResultSet resultSet) throws SQLException { PlayerStats playerStats = new PlayerStats(); @@ -425,10 +458,12 @@ public class StatsManager extends MiniDbClientPlugin Set(uuid, playerStats); } + */ - @Override +/* @Override public String getQuery(int accountId, String uuid, String name) { return "SELECT stats.name, value FROM accountStatsAllTime INNER JOIN stats ON stats.id = accountStatsAllTime.statId WHERE accountStatsAllTime.accountId = '" + accountId + "';"; } + */ } \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsRepository.java index aa67bc775..57030f09b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsRepository.java @@ -219,7 +219,7 @@ public class StatsRepository extends RepositoryBase if (result.isNotEmpty()) { - playerStats = new PlayerStats(); + playerStats = new PlayerStats(false); for (Record2 record : result) { playerStats.addStat(record.value1(), record.value2().longValue());