9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2026-01-06 15:41:56 +00:00

fix: Handle Bukkit objects that don't fully implement Keyed

This commit is contained in:
William
2023-12-26 14:57:40 +00:00
parent a3e269c00b
commit 414246f243
4 changed files with 42 additions and 21 deletions

View File

@@ -48,7 +48,7 @@ import java.util.logging.Level;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static net.william278.husksync.util.BukkitTypeMatcher.*;
import static net.william278.husksync.util.BukkitKeyedAdapter.*;
public abstract class BukkitData implements Data {
@@ -696,7 +696,8 @@ public abstract class BukkitData implements Data {
public Map<String, Map<String, Integer>> getBlockStatistics() {
return blockStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect(
TreeMap::new,
(m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll
(m, e) -> getKeyName(e.getKey()).ifPresent(key -> m.put(key, convertStatistics(e.getValue()))),
TreeMap::putAll
);
}
@@ -705,7 +706,8 @@ public abstract class BukkitData implements Data {
public Map<String, Map<String, Integer>> getItemStatistics() {
return itemStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect(
TreeMap::new,
(m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll
(m, e) -> getKeyName(e.getKey()).ifPresent(key -> m.put(key, convertStatistics(e.getValue()))),
TreeMap::putAll
);
}
@@ -714,7 +716,8 @@ public abstract class BukkitData implements Data {
public Map<String, Map<String, Integer>> getEntityStatistics() {
return entityStatistics.entrySet().stream().filter(entry -> entry.getKey() != null).collect(
TreeMap::new,
(m, e) -> m.put(e.getKey().getKey().toString(), convertStatistics(e.getValue())), TreeMap::putAll
(m, e) -> getKeyName(e.getKey()).ifPresent(key -> m.put(key, convertStatistics(e.getValue()))),
TreeMap::putAll
);
}
@@ -722,13 +725,8 @@ public abstract class BukkitData implements Data {
private <T extends Keyed> Map<String, Integer> convertStatistics(@NotNull Map<T, Integer> stats) {
return stats.entrySet().stream().filter(entry -> entry.getKey() != null).collect(
TreeMap::new,
(m, e) -> {
try {
m.put(e.getKey().getKey().toString(), e.getValue());
} catch (Throwable t) {
// Ignore; skip elements with invalid keys (e.g., legacy materials)
}
}, TreeMap::putAll
(m, e) -> getKeyName(e.getKey()).ifPresent(key -> m.put(key, e.getValue())),
TreeMap::putAll
);
}

View File

@@ -40,7 +40,7 @@ import java.util.Arrays;
import java.util.function.Consumer;
import java.util.logging.Level;
import static net.william278.husksync.util.BukkitTypeMatcher.matchMaterial;
import static net.william278.husksync.util.BukkitKeyedAdapter.matchMaterial;
/**
* Bukkit platform implementation of an {@link OnlineUser}

View File

@@ -19,6 +19,7 @@
package net.william278.husksync.util;
import org.bukkit.Keyed;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.entity.EntityType;
@@ -26,26 +27,48 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Optional;
public final class BukkitTypeMatcher {
// Utility class for adapting "Keyed" Bukkit objects
public final class BukkitKeyedAdapter {
@Nullable
public static Statistic matchStatistic(@NotNull String key) {
return Arrays.stream(Statistic.values())
.filter(stat -> stat.getKey().toString().equals(key))
.findFirst().orElse(null);
try {
return Arrays.stream(Statistic.values())
.filter(stat -> stat.getKey().toString().equals(key))
.findFirst().orElse(null);
} catch (Throwable e) {
return null;
}
}
@Nullable
public static EntityType matchEntityType(@NotNull String key) {
return Arrays.stream(EntityType.values())
.filter(entityType -> entityType.getKey().toString().equals(key))
.findFirst().orElse(null);
try {
return Arrays.stream(EntityType.values())
.filter(entityType -> entityType.getKey().toString().equals(key))
.findFirst().orElse(null);
} catch (Throwable e) {
return null;
}
}
@Nullable
public static Material matchMaterial(@NotNull String key) {
return Material.matchMaterial(key);
try {
return Material.matchMaterial(key);
} catch (Throwable e) {
return null;
}
}
public static Optional<String> getKeyName(@NotNull Keyed keyed) {
try {
return Optional.of(keyed.getKey().toString());
} catch (Throwable e) {
return Optional.empty();
}
}
}

View File

@@ -44,7 +44,7 @@ import java.time.OffsetDateTime;
import java.util.*;
import java.util.logging.Level;
import static net.william278.husksync.util.BukkitTypeMatcher.*;
import static net.william278.husksync.util.BukkitKeyedAdapter.*;
public class BukkitLegacyConverter extends LegacyConverter {