From 0caec74436266b14f5ce14533960012ee7e1c478 Mon Sep 17 00:00:00 2001 From: William Date: Sat, 23 Sep 2023 14:08:53 +0100 Subject: [PATCH] Improve stat map resilience for modded block types --- .../william278/husksync/data/BukkitData.java | 45 ++++++++----------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java b/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java index d7c17233..7d93c9bd 100644 --- a/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java +++ b/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java @@ -28,10 +28,7 @@ import net.william278.husksync.HuskSync; import net.william278.husksync.adapter.Adaptable; import net.william278.husksync.user.BukkitUser; import org.apache.commons.lang.NotImplementedException; -import org.bukkit.Bukkit; -import org.bukkit.GameRule; -import org.bukkit.Material; -import org.bukkit.Statistic; +import org.bukkit.*; import org.bukkit.advancement.AdvancementProgress; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; @@ -529,7 +526,7 @@ public abstract class BukkitData implements Data { } public static class Statistics extends BukkitData implements Data.Statistics { - private Map untypedStatistics; + private Map genericStatistics; private Map> blockStatistics; private Map> itemStatistics; private Map> entityStatistics; @@ -538,7 +535,7 @@ public abstract class BukkitData implements Data { @NotNull Map> blockStatistics, @NotNull Map> itemStatistics, @NotNull Map> entityStatistics) { - this.untypedStatistics = genericStatistics; + this.genericStatistics = genericStatistics; this.blockStatistics = blockStatistics; this.itemStatistics = itemStatistics; this.entityStatistics = entityStatistics; @@ -659,7 +656,7 @@ public abstract class BukkitData implements Data { @Override public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) throws IllegalStateException { - untypedStatistics.forEach((stat, value) -> applyStat(user, stat, null, value)); + genericStatistics.forEach((stat, value) -> applyStat(user, stat, null, value)); blockStatistics.forEach((stat, m) -> m.forEach((block, value) -> applyStat(user, stat, block, value))); itemStatistics.forEach((stat, m) -> m.forEach((item, value) -> applyStat(user, stat, item, value))); entityStatistics.forEach((stat, m) -> m.forEach((entity, value) -> applyStat(user, stat, entity, value))); @@ -682,45 +679,41 @@ public abstract class BukkitData implements Data { @NotNull @Override public Map getGenericStatistics() { - return untypedStatistics.entrySet().stream().collect( - TreeMap::new, - (m, e) -> m.put(e.getKey().getKey().toString(), e.getValue()), TreeMap::putAll - ); + return convertStatistics(genericStatistics); } @NotNull @Override public Map> getBlockStatistics() { - return blockStatistics.entrySet().stream().collect( + return blockStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect( TreeMap::new, - (m, e) -> m.put(e.getKey().getKey().toString(), e.getValue().entrySet().stream().collect( - TreeMap::new, - (m2, e2) -> m2.put(e2.getKey().getKey().toString(), e2.getValue()), TreeMap::putAll - )), TreeMap::putAll + (m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll ); } @NotNull @Override public Map> getItemStatistics() { - return itemStatistics.entrySet().stream().collect( + return itemStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect( TreeMap::new, - (m, e) -> m.put(e.getKey().getKey().toString(), e.getValue().entrySet().stream().collect( - TreeMap::new, - (m2, e2) -> m2.put(e2.getKey().getKey().toString(), e2.getValue()), TreeMap::putAll - )), TreeMap::putAll + (m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll ); } @NotNull @Override public Map> getEntityStatistics() { - return entityStatistics.entrySet().stream().collect( + return entityStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect( TreeMap::new, - (m, e) -> m.put(e.getKey().getKey().toString(), e.getValue().entrySet().stream().collect( - TreeMap::new, - (m2, e2) -> m2.put(e2.getKey().getKey().toString(), e2.getValue()), TreeMap::putAll - )), TreeMap::putAll + (m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll + ); + } + + @NotNull + private Map convertStatistics(@NotNull Map stats) { + return stats.entrySet().stream().filter(entry -> entry.getKey() != null).collect( + TreeMap::new, + (m, e) -> m.put(e.getKey().getKey().toString(), e.getValue()), TreeMap::putAll ); }