diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/PlayerStats.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/PlayerStats.java index 187ab1f9d..95eb54ffc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/PlayerStats.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/PlayerStats.java @@ -4,14 +4,21 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import javax.annotation.concurrent.GuardedBy; +import javax.annotation.concurrent.ThreadSafe; + /** * Represents a player's statistic information. This object is thread-safe */ +@ThreadSafe public class PlayerStats { - private final Object lock = new Object(); + private final Object _lock = new Object(); + @GuardedBy("_lock") private Map _stats = new HashMap<>(); + + @GuardedBy("_lock") private Map _statsOld = new HashMap<>(); private final boolean _temporary; @@ -35,7 +42,7 @@ public class PlayerStats */ long addStat(String statName, long value) { - synchronized (lock) + synchronized (_lock) { return _stats.merge(statName, Math.max(0, value), Long::sum); } @@ -50,7 +57,7 @@ public class PlayerStats */ long setStat(String statName, long value) { - synchronized (lock) + synchronized (_lock) { _stats.put(statName, value); return value; @@ -59,7 +66,7 @@ public class PlayerStats void setStatOld(String statName, long value) { - synchronized (lock) + synchronized (_lock) { _statsOld.put(statName, value); } @@ -73,7 +80,7 @@ public class PlayerStats */ public long getStat(String statName) { - synchronized (lock) + synchronized (_lock) { long cur = _stats.getOrDefault(statName, 0L); long old = _statsOld.getOrDefault(statName, 0L); @@ -83,7 +90,7 @@ public class PlayerStats public long getStatOld(String statName) { - synchronized (lock) + synchronized (_lock) { return _statsOld.getOrDefault(statName, 0L); } @@ -91,7 +98,7 @@ public class PlayerStats public long getJustCurrentStat(String statName) { - synchronized (lock) + synchronized (_lock) { return _stats.getOrDefault(statName, 0L); } @@ -102,10 +109,10 @@ public class PlayerStats */ public Map getStats() { - synchronized (lock) + synchronized (_lock) { // make it unmodifiable so that people who try to edit it will get an exception instead of silently failing return Collections.unmodifiableMap(new HashMap<>(_stats)); } } -} +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 031058156..306ddd1b9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -180,13 +180,10 @@ public class StatsManager extends MiniClientPlugin//MiniDbClientPlu } 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 = snapshot.addStat(statName, incrementBy); + long newValue = snapshot.addStat(statName, value); UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player, statName, oldCompositeValue, newValue)); - registerNewStat(statName, () -> addToQueue(statName, client, incrementBy)); + registerNewStat(statName, () -> addToQueue(statName, client, value)); } @@ -221,25 +218,10 @@ public class StatsManager extends MiniClientPlugin//MiniDbClientPlu { registerNewStat(statName, () -> { - _repository.loadStatsFromOld(accountId, oldMap -> - { - runAsync(() -> - { - Map> uploadQueue = new HashMap<>(); - uploadQueue.computeIfAbsent(accountId, key -> new HashMap<>()).put(_stats.get(statName), value); - oldMap.forEach((stat, amountPair) -> - { - int statId = _stats.get(stat); - if (uploadQueue.get(accountId).containsKey(statId) && amountPair.getLeft() > amountPair.getRight()) - { - long diff = amountPair.getLeft() - amountPair.getRight(); - uploadQueue.get(accountId).merge(statId, diff, Long::sum); - } - }); - - _repository.saveStats(uploadQueue, false); - }); - }); + Map> uploadQueue = new HashMap<>(); + uploadQueue.computeIfAbsent(accountId, key -> new HashMap<>()).put(_stats.get(statName), value); + + _repository.saveStats(uploadQueue, false); }); } @@ -391,32 +373,16 @@ public class StatsManager extends MiniClientPlugin//MiniDbClientPlu _repository.loadStatsFromOld(accountId, data -> { PlayerStats stats = new PlayerStats(false); - Map decrement = new HashMap<>(); data.forEach((stat, values) -> { stats.setStatOld(stat, values.getLeft()); - if (values.getLeft() > 0 && values.getRight() >= (values.getLeft() * 2)) - { - decrement.put(stat, -1 * values.getLeft()); - stats.addStat(stat, values.getRight() - values.getLeft()); - } - else - { - stats.addStat(stat, values.getRight()); - } + stats.addStat(stat, values.getRight()); }); if (_loading.remove(uuid)) { Set(uuid, stats); - if (!decrement.isEmpty()) - { - decrement.forEach((stat, value) -> - { - addToQueue(stat, _coreClientManager.Get(uuid), value); - }); - } UtilPlayer.message(event.getPlayer(), F.main(getName(), "Your stats have been loaded!")); } });