From fef03ea6daa4d9c754ce8247993cde029f0ece46 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sun, 4 Dec 2022 00:59:16 +0800 Subject: [PATCH] Use new lookup api --- .../citizensnpcs/commands/NPCCommands.java | 10 +-- .../net/citizensnpcs/trait/LookClose.java | 16 ++--- .../net/citizensnpcs/trait/RotationTrait.java | 64 +++++++++++++++---- .../citizensnpcs/trait/shop/ItemAction.java | 10 ++- .../net/citizensnpcs/trait/text/Text.java | 8 +-- .../trait/versioned/BossBarTrait.java | 9 ++- .../trait/waypoint/triggers/ChatTrigger.java | 14 ++-- 7 files changed, 81 insertions(+), 50 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index 8983053ce..dd16b492f 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -10,7 +10,6 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.UUID; @@ -2245,12 +2244,9 @@ public class NPCCommands { Entity player = (Player) sender; final Location location = args.getSenderLocation(); List search = player.getNearbyEntities(range, range, range); - Collections.sort(search, new Comparator() { - @Override - public int compare(Entity o1, Entity o2) { - double d = o1.getLocation().distanceSquared(location) - o2.getLocation().distanceSquared(location); - return d > 0 ? 1 : d < 0 ? -1 : 0; - } + Collections.sort(search, (o1, o2) -> { + double d = o1.getLocation().distanceSquared(location) - o2.getLocation().distanceSquared(location); + return d > 0 ? 1 : d < 0 ? -1 : 0; }); for (Entity possibleNPC : search) { NPC test = registry.getNPC(possibleNPC); diff --git a/main/src/main/java/net/citizensnpcs/trait/LookClose.java b/main/src/main/java/net/citizensnpcs/trait/LookClose.java index 4c19c1c48..4bf737172 100644 --- a/main/src/main/java/net/citizensnpcs/trait/LookClose.java +++ b/main/src/main/java/net/citizensnpcs/trait/LookClose.java @@ -6,7 +6,6 @@ import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.metadata.MetadataValue; @@ -92,12 +91,11 @@ public class LookClose extends Trait implements Toggleable { if (lookingAt != null) { if (randomSwitchTargets && t <= 0) { List options = Lists.newArrayList(); - for (Entity entity : npc.getEntity().getNearbyEntities(range, range, range)) { - if (entity == lookingAt || !(entity instanceof Player) - || CitizensAPI.getNPCRegistry().getNPC(entity) != null) { + for (Player player : CitizensAPI.getLocationLookup().getNearbyPlayers(npc.getEntity().getLocation(), + range)) { + if (player == lookingAt || CitizensAPI.getNPCRegistry().getNPC(player) != null) { continue; } - Player player = (Player) entity; if (player.getLocation().getWorld() != NPC_LOCATION.getWorld() || isInvisible(player)) continue; options.add(player); @@ -109,15 +107,13 @@ public class LookClose extends Trait implements Toggleable { } } else { double min = range; - for (Entity entity : npc.getEntity().getNearbyEntities(range, range, range)) { - if (!(entity instanceof Player)) - continue; - Player player = (Player) entity; + for (Player player : CitizensAPI.getLocationLookup().getNearbyPlayers(npc.getEntity().getLocation(), + range)) { Location location = player.getLocation(CACHE_LOCATION); if (location.getWorld() != NPC_LOCATION.getWorld()) continue; double dist = location.distance(NPC_LOCATION); - if (dist > min || CitizensAPI.getNPCRegistry().getNPC(entity) != null || isInvisible(player)) + if (dist > min || CitizensAPI.getNPCRegistry().getNPC(player) != null || isInvisible(player)) continue; min = dist; lookingAt = player; diff --git a/main/src/main/java/net/citizensnpcs/trait/RotationTrait.java b/main/src/main/java/net/citizensnpcs/trait/RotationTrait.java index af11a7c4b..dbd2a1f42 100644 --- a/main/src/main/java/net/citizensnpcs/trait/RotationTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/RotationTrait.java @@ -1,7 +1,11 @@ package net.citizensnpcs.trait; +import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import java.util.function.Function; import org.bukkit.Location; @@ -9,7 +13,10 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.persistence.Persistable; @@ -25,6 +32,7 @@ public class RotationTrait extends Trait { private final RotationParams globalParameters = new RotationParams(); private final RotationSession globalSession = new RotationSession(globalParameters); private final List localSessions = Lists.newArrayList(); + private final Map localSessionsByUUID = Maps.newHashMap(); public RotationTrait() { super("rotationtrait"); @@ -37,12 +45,19 @@ public class RotationTrait extends Trait { /** * @return The created session */ - public RotationSession createLocalSession(RotationParams params) { - if (params.filter == null) + public LocalRotationSession createLocalSession(RotationParams params) { + if (params.filter == null && params.uuidFilter == null) throw new IllegalStateException(); RotationSession session = new RotationSession(params); - localSessions.add(new LocalRotationSession(session)); - return session; + LocalRotationSession lrs = new LocalRotationSession(session); + if (params.uuidFilter != null) { + for (UUID uuid : params.uuidFilter) { + localSessionsByUUID.put(uuid, lrs); + } + } else { + localSessions.add(lrs); + } + return lrs; } private double getEyeY() { @@ -57,6 +72,9 @@ public class RotationTrait extends Trait { } public LocalRotationSession getLocalSession(Player player) { + LocalRotationSession lrs = localSessionsByUUID.get(player.getUniqueId()); + if (lrs != null) + return lrs; for (LocalRotationSession session : localSessions) { if (session.accepts(player)) { return session; @@ -111,8 +129,13 @@ public class RotationTrait extends Trait { if (!npc.isSpawned()) return; - for (Iterator itr = localSessions.iterator(); itr.hasNext();) { + Set run = Sets.newHashSet(); + for (Iterator itr = Iterables.concat(localSessions, localSessionsByUUID.values()) + .iterator(); itr.hasNext();) { LocalRotationSession session = itr.next(); + if (run.contains(session)) + continue; + run.add(session); session.run(npc.getEntity()); if (!session.isActive()) { itr.remove(); @@ -144,6 +167,7 @@ public class RotationTrait extends Trait { } public static class LocalRotationSession { + private boolean ended; private final RotationSession session; private RotationTriple triple; @@ -155,6 +179,10 @@ public class RotationTrait extends Trait { return session.params.accepts(player); } + public void end() { + this.ended = true; + } + public float getBodyYaw() { return triple.bodyYaw; } @@ -168,7 +196,7 @@ public class RotationTrait extends Trait { } public boolean isActive() { - return session.isActive(); + return !ended && session.isActive(); } public void run(Entity entity) { @@ -204,6 +232,7 @@ public class RotationTrait extends Trait { private float maxYawPerTick = 40; private boolean persist = false; private float[] pitchRange = { -180, 180 }; + private List uuidFilter; private float[] yawRange = { -180, 180 }; public boolean accepts(Player player) { @@ -288,13 +317,6 @@ public class RotationTrait extends Trait { return Util.clamp(out, pitchRange[0], pitchRange[1], 360); } - /* - * public Vector3 SuperSmoothVector3Lerp( Vector3 pastPosition, Vector3 pastTargetPosition, Vector3 targetPosition, float time, float speed ){ - Vector3 f = pastPosition - pastTargetPosition + (targetPosition - pastTargetPosition) / (speed * time); - return targetPosition - (targetPosition - pastTargetPosition) / (speed*time) + f * Mathf.Exp(-speed*time); - } - */ - private float rotateTowards(float target, float current, float maxRotPerTick) { float diff = Util.clamp(current - target); return target + clamp(diff, -maxRotPerTick, maxRotPerTick); @@ -335,6 +357,22 @@ public class RotationTrait extends Trait { } } + /* + * public Vector3 SuperSmoothVector3Lerp( Vector3 pastPosition, Vector3 pastTargetPosition, Vector3 targetPosition, float time, float speed ){ + Vector3 f = pastPosition - pastTargetPosition + (targetPosition - pastTargetPosition) / (speed * time); + return targetPosition - (targetPosition - pastTargetPosition) / (speed*time) + f * Mathf.Exp(-speed*time); + } + */ + + public RotationParams uuidFilter(List uuids) { + this.uuidFilter = uuids; + return this; + } + + public RotationParams uuidFilter(UUID... uuids) { + return uuidFilter(Arrays.asList(uuids)); + } + public RotationParams yawRange(float[] val) { this.yawRange = val; return this; diff --git a/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java b/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java index cc5f1894b..723ee8e35 100644 --- a/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java +++ b/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java @@ -15,6 +15,7 @@ import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; +import com.google.common.base.Joiner; import com.google.common.collect.Lists; import net.citizensnpcs.api.gui.BooleanSlotHandler; @@ -212,9 +213,12 @@ public class ItemAction extends NPCShopAction { base.compareSimilarity = res; return res ? ChatColor.GREEN + "On" : ChatColor.RED + "Off"; }, base.compareSimilarity)); - ctx.getSlot(3 * 9 + 3).setItemStack(new ItemStack(Material.BOOK), "NBT comparison filter"); - ctx.getSlot(3 * 9 + 3).addClickHandler((event) -> ctx.getMenu() - .transition(InputMenus.stringSetter(() -> "", res -> base.metaFilter = Lists.newArrayList(res)))); + ctx.getSlot(3 * 9 + 3).setItemStack(new ItemStack(Material.BOOK), "NBT comparison filter", + Joiner.on("\n").join(base.metaFilter)); + ctx.getSlot(3 * 9 + 3) + .addClickHandler((event) -> ctx.getMenu() + .transition(InputMenus.stringSetter(() -> Joiner.on(',').join(base.metaFilter), + res -> base.metaFilter = Arrays.asList(res.split(","))))); } @Override diff --git a/main/src/main/java/net/citizensnpcs/trait/text/Text.java b/main/src/main/java/net/citizensnpcs/trait/text/Text.java index 31f02c502..d33cff1a5 100644 --- a/main/src/main/java/net/citizensnpcs/trait/text/Text.java +++ b/main/src/main/java/net/citizensnpcs/trait/text/Text.java @@ -13,7 +13,6 @@ import org.bukkit.conversations.Conversation; import org.bukkit.conversations.ConversationAbandonedEvent; import org.bukkit.conversations.ConversationAbandonedListener; import org.bukkit.conversations.ConversationFactory; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -187,11 +186,10 @@ public class Text extends Trait implements Runnable, Listener, ConversationAband if (!talkClose) return; - List nearby = npc.getEntity().getNearbyEntities(range, range, range); - for (Entity search : nearby) { - if (!(search instanceof Player) || ((Player) search).getGameMode() == GameMode.SPECTATOR) + for (Player player : CitizensAPI.getLocationLookup().getNearbyPlayers(npc.getEntity().getLocation(), range)) { + if (player.getGameMode() == GameMode.SPECTATOR) continue; - sendCooldownMessage((Player) search); + sendCooldownMessage(player); } } diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java index 85ee21a1a..327977fdb 100644 --- a/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java @@ -19,6 +19,7 @@ import com.google.common.base.Splitter; import com.google.common.collect.Lists; import net.citizensnpcs.Settings.Setting; +import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.command.Command; import net.citizensnpcs.api.command.CommandContext; import net.citizensnpcs.api.command.Flag; @@ -157,11 +158,9 @@ public class BossBarTrait extends Trait { } if (barCache != null) { barCache.removeAll(); - for (Entity entity : npc.getEntity().getNearbyEntities(Setting.BOSSBAR_RANGE.asInt() / 2, - Setting.BOSSBAR_RANGE.asInt() / 2, Setting.BOSSBAR_RANGE.asInt() / 2)) { - if (entity instanceof Player) { - barCache.addPlayer((Player) entity); - } + for (Player player : CitizensAPI.getLocationLookup().getNearbyPlayers(npc.getEntity().getLocation(), + Setting.BOSSBAR_RANGE.asInt())) { + barCache.addPlayer(player); } } } diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/ChatTrigger.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/ChatTrigger.java index 9bd2a4f77..05b31040e 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/ChatTrigger.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/triggers/ChatTrigger.java @@ -4,12 +4,12 @@ import java.util.Collection; import java.util.List; import org.bukkit.Location; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import com.google.common.base.Joiner; import com.google.common.collect.Lists; +import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.util.Messaging; @@ -37,15 +37,15 @@ public class ChatTrigger implements WaypointTrigger { public void onWaypointReached(NPC npc, Location waypoint) { if (radius < 0) { for (Player player : npc.getEntity().getWorld().getPlayers()) { - for (String line : lines) + for (String line : lines) { Messaging.send(player, line); + } } } else { - for (Entity entity : npc.getEntity().getNearbyEntities(radius, radius, radius)) { - if (!(entity instanceof Player)) - continue; - for (String line : lines) - Messaging.send((Player) entity, line); + for (Player player : CitizensAPI.getLocationLookup().getNearbyPlayers(npc.getStoredLocation(), radius)) { + for (String line : lines) { + Messaging.send(player, line); + } } } }