From d495724de1db5ef9cbacd1f66e204b3a6516f434 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sat, 24 Dec 2022 21:43:22 +0800 Subject: [PATCH] Add marker API to player metadata --- .../net/citizensnpcs/api/LocationLookup.java | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/citizensnpcs/api/LocationLookup.java b/src/main/java/net/citizensnpcs/api/LocationLookup.java index c63631d7..bb80f34a 100644 --- a/src/main/java/net/citizensnpcs/api/LocationLookup.java +++ b/src/main/java/net/citizensnpcs/api/LocationLookup.java @@ -13,17 +13,15 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import com.google.common.collect.HashMultimap; import com.google.common.collect.Maps; -import com.google.common.collect.SetMultimap; import ch.ethz.globis.phtree.PhTreeF; public class LocationLookup implements Runnable { - private final Map metadata = Maps.newHashMap(); + private final Map> metadata = Maps.newHashMap(); private final Map> worlds = Maps.newHashMap(); - public PerPlayerMetadata getMetadata(String key) { + public PerPlayerMetadata getMetadata(String key) { return metadata.get(key); } @@ -34,6 +32,7 @@ public Iterable getNearbyPlayers(Location base, double dist) { return () -> tree.rangeQuery(dist, base.getX(), base.getY(), base.getZ()); } + @SuppressWarnings({ "unchecked", "rawtypes" }) public void onJoin(PlayerJoinEvent event) { Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), () -> { updateWorld(event.getPlayer().getWorld()); @@ -48,14 +47,16 @@ public void onJoin(PlayerJoinEvent event) { public void onQuit(PlayerQuitEvent event) { Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), () -> { updateWorld(event.getPlayer().getWorld()); - for (PerPlayerMetadata meta : metadata.values()) { - meta.sent.removeAll(event.getPlayer().getUniqueId()); + for (PerPlayerMetadata meta : metadata.values()) { + meta.sent.remove(event.getPlayer().getUniqueId()); } }); } - public PerPlayerMetadata registerMetadata(String key, BiConsumer onJoin) { - return metadata.computeIfAbsent(key, (s) -> new PerPlayerMetadata(onJoin)); + @SuppressWarnings("unchecked") + public PerPlayerMetadata registerMetadata(String key, + BiConsumer, PlayerJoinEvent> onJoin) { + return (PerPlayerMetadata) metadata.computeIfAbsent(key, (s) -> new PerPlayerMetadata(onJoin)); } @Override @@ -80,12 +81,28 @@ private void updateWorld(World world) { } } - public static class PerPlayerMetadata { - private final BiConsumer onJoin; - public SetMultimap sent = HashMultimap.create(); + public static class PerPlayerMetadata { + private final BiConsumer, PlayerJoinEvent> onJoin; + private final Map> sent = Maps.newHashMap(); - public PerPlayerMetadata(BiConsumer onJoin) { + public PerPlayerMetadata(BiConsumer, PlayerJoinEvent> onJoin) { this.onJoin = onJoin; } + + public T getMarker(UUID key, String value) { + return sent.getOrDefault(key, Collections.emptyMap()).get(value); + } + + public boolean has(UUID key, String value) { + return sent.getOrDefault(key, Collections.emptyMap()).containsKey(value); + } + + public boolean remove(UUID key, String value) { + return sent.getOrDefault(key, Collections.emptyMap()).remove(value) != null; + } + + public void set(UUID key, String value, T marker) { + sent.computeIfAbsent(key, (k) -> Maps.newHashMap()).put(value, marker); + } } }