Fix outdated stats being loaded when players transfer servers
This commit is contained in:
parent
1380ef8e33
commit
02dc0458d9
|
@ -32,7 +32,7 @@ public abstract class MiniClientPlugin<DataType> 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<DataType> extends MiniPlugin
|
|||
}
|
||||
}
|
||||
|
||||
public void saveData(String name, int accountId) {}
|
||||
public void saveData(String name, UUID uuid, int accountId) {}
|
||||
|
||||
public DataType Get(Player player)
|
||||
{
|
||||
|
|
|
@ -387,11 +387,10 @@ public class QuestManager extends MiniDbClientPlugin<QuestClientData>
|
|||
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)
|
||||
{
|
||||
|
|
|
@ -14,6 +14,18 @@ public class PlayerStats
|
|||
private Map<String, Long> _stats = new HashMap<>();
|
||||
private Map<String, Long> _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
|
||||
*
|
||||
|
|
|
@ -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<PlayerStats>
|
||||
public class StatsManager extends MiniClientPlugin<PlayerStats>//MiniDbClientPlugin<PlayerStats>
|
||||
{
|
||||
public enum Perm implements Permission
|
||||
{
|
||||
|
@ -55,16 +55,19 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||
private final Map<CoreClient, Map<String, Long>> _statUploadQueue = new HashMap<>();
|
||||
private final Map<CoreClient, Map<String, Long>> _statUploadQueueOverRidable = new HashMap<>();
|
||||
|
||||
private final Set<UUID> _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<PlayerStats>
|
|||
{
|
||||
return "SELECT stats.name, value FROM accountStat INNER JOIN stats ON stats.id = accountStat.statId WHERE accountStat.accountId = '" + accountId + "';";
|
||||
}
|
||||
});
|
||||
});*/
|
||||
|
||||
UtilScheduler.runAsyncEvery(UpdateType.SEC, () ->
|
||||
{
|
||||
|
@ -166,12 +169,18 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||
return;
|
||||
|
||||
CoreClient client = _coreClientManager.Get(player);
|
||||
PlayerStats snapshot = Get(player);
|
||||
|
||||
long oldCompositeValue = Get(player).getStat(statName);
|
||||
long oldValue = Get(player).getJustCurrentStat(statName);
|
||||
long oldOldValue = Get(player).getStatOld(statName);
|
||||
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<PlayerStats>
|
|||
@EventHandler
|
||||
private void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
Set<String> 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);
|
||||
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
|
||||
}
|
||||
|
||||
statsToReset.forEach(stat ->
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onLogin(AsyncPlayerPreLoginEvent event)
|
||||
{
|
||||
setStat(event.getPlayer(), stat, 0);
|
||||
});
|
||||
_loading.add(event.getUniqueId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -402,10 +419,26 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
|
|||
@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
|
||||
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<PlayerStats>
|
|||
|
||||
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 + "';";
|
||||
}
|
||||
*/
|
||||
}
|
|
@ -219,7 +219,7 @@ public class StatsRepository extends RepositoryBase
|
|||
|
||||
if (result.isNotEmpty())
|
||||
{
|
||||
playerStats = new PlayerStats();
|
||||
playerStats = new PlayerStats(false);
|
||||
for (Record2<String, ULong> record : result)
|
||||
{
|
||||
playerStats.addStat(record.value1(), record.value2().longValue());
|
||||
|
|
Loading…
Reference in New Issue