Simplify getAllNPCs() implementation

This commit is contained in:
fullwall 2023-09-03 23:41:38 +08:00
parent 7c0eb422a6
commit 28a3e0bf79
6 changed files with 30 additions and 41 deletions

View File

@ -416,7 +416,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
}));
selector = new NPCSelector(this);
Bukkit.getPluginManager().registerEvents(new EventListen(storedRegistries), this);
Bukkit.getPluginManager().registerEvents(new EventListen(), this);
Bukkit.getPluginManager().registerEvents(new Placeholders(), this);
Placeholders.registerNPCPlaceholder(Pattern.compile("command_[a-zA-Z_0-9]+"), (npc, sender, input) -> {
npc = npc.hasTrait(ClickRedirectTrait.class) ? npc.getTraitNullable(ClickRedirectTrait.class).getNPC()

View File

@ -3,7 +3,6 @@ package net.citizensnpcs;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@ -101,7 +100,6 @@ import net.citizensnpcs.api.event.NPCVehicleDamageEvent;
import net.citizensnpcs.api.event.PlayerCreateNPCEvent;
import net.citizensnpcs.api.event.SpawnReason;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.NPCRegistry;
import net.citizensnpcs.api.trait.trait.Owner;
import net.citizensnpcs.api.trait.trait.PlayerFilter;
import net.citizensnpcs.api.util.Messaging;
@ -121,13 +119,11 @@ import net.citizensnpcs.util.Util;
public class EventListen implements Listener {
private Listener chunkEventListener;
private final Map<String, NPCRegistry> registries;
private final SkinUpdateTracker skinUpdateTracker;
private final ListMultimap<ChunkCoord, NPC> toRespawn = ArrayListMultimap.create(64, 4);
EventListen(Map<String, NPCRegistry> registries) {
this.registries = registries;
this.skinUpdateTracker = new SkinUpdateTracker(registries);
EventListen() {
this.skinUpdateTracker = new SkinUpdateTracker();
try {
Class.forName("org.bukkit.event.world.EntitiesLoadEvent");
Bukkit.getPluginManager().registerEvents(new Listener() {
@ -209,9 +205,7 @@ public class EventListen implements Listener {
}
private Iterable<NPC> getAllNPCs() {
return Iterables.filter(
Iterables.<NPC> concat(CitizensAPI.getNPCRegistry(), Iterables.concat(registries.values())),
Predicates.notNull());
return Iterables.filter(Iterables.concat(CitizensAPI.getNPCRegistries()), Predicates.notNull());
}
void loadNPCs(ChunkEvent event) {

View File

@ -3057,17 +3057,19 @@ public class NPCCommands {
@Command(
aliases = { "npc" },
usage = "speak [message] --target [npcid|player name] --range (range to look for entities to speak to in blocks)",
usage = "speak [message] --bubble [duration] --target [npcid|player name] --range (range to look for entities to speak to in blocks)",
desc = "Says a message from the NPC",
modifiers = { "speak" },
min = 2,
permission = "citizens.npc.speak")
public void speak(CommandContext args, CommandSender sender, NPC npc, @Flag("type") String type,
@Flag("target") String target, @Flag("range") Float range) throws CommandException {
public void speak(CommandContext args, CommandSender sender, NPC npc, @Flag("bubble") Duration bubbleDuration,
@Flag("type") String type, @Flag("target") String target, @Flag("range") Float range)
throws CommandException {
String message = args.getJoinedStrings(1);
SpeechContext context = new SpeechContext(message);
Player playerRecipient = null;
if (target != null) {
if (target.matches("\\d+")) {
NPC targetNPC = CitizensAPI.getNPCRegistry().getById(Integer.valueOf(args.getFlag("target")));
@ -3077,10 +3079,17 @@ public class NPCCommands {
Player player = Bukkit.getPlayerExact(target);
if (player != null) {
context.addRecipient(player);
playerRecipient = player;
}
}
}
if (bubbleDuration != null) {
HologramTrait trait = npc.getOrAddTrait(HologramTrait.class);
trait.addTemporaryLine(Placeholders.replace(message, playerRecipient, npc), Util.toTicks(bubbleDuration));
return;
}
if (range != null) {
npc.getEntity().getNearbyEntities(range, range, range).forEach(e -> {
if (!CitizensAPI.getNPCRegistry().isNPC(e)) {

View File

@ -28,7 +28,6 @@ import com.google.common.collect.Sets;
import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.npc.NPCRegistry;
import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.util.Util;
@ -41,7 +40,6 @@ public class SkinUpdateTracker {
private final Map<SkinnableEntity, Void> navigating = new WeakHashMap<SkinnableEntity, Void>(25);
private final Map<UUID, PlayerTracker> playerTrackers = new HashMap<UUID, PlayerTracker>(
Math.max(128, Math.min(1024, Bukkit.getMaxPlayers() / 2)));
private final Map<String, NPCRegistry> registries;
private final NPCNavigationUpdater updater = new NPCNavigationUpdater();
/**
@ -50,11 +48,7 @@ public class SkinUpdateTracker {
* @param registries
* Map of other registries.
*/
public SkinUpdateTracker(Map<String, NPCRegistry> registries) {
Preconditions.checkNotNull(registries);
this.registries = registries;
public SkinUpdateTracker() {
updater.runTaskTimer(CitizensAPI.getPlugin(), 1, 1);
new NPCNavigationTracker().runTaskTimer(CitizensAPI.getPlugin(), 3, 7);
}
@ -103,8 +97,7 @@ public class SkinUpdateTracker {
}
private Iterable<NPC> getAllNPCs() {
return Iterables.filter(Iterables.concat(CitizensAPI.getNPCRegistry(), Iterables.concat(registries.values())),
Predicates.notNull());
return Iterables.filter(Iterables.concat(CitizensAPI.getNPCRegistries()), Predicates.notNull());
}
private List<SkinnableEntity> getNearbyNPCs(Player player, boolean reset, boolean checkFov) {

View File

@ -258,9 +258,9 @@ public class CommandTrait extends Trait {
: handIn;
NPCCommandDispatchEvent event = new NPCCommandDispatchEvent(npc, player);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
if (event.isCancelled())
return;
}
Runnable task = new Runnable() {
Boolean charged = null;

View File

@ -22,6 +22,7 @@ import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.ai.speech.SpeechContext;
import net.citizensnpcs.api.event.NPCRightClickEvent;
import net.citizensnpcs.api.exception.NPCLoadException;
import net.citizensnpcs.api.persistence.Persist;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.trait.TraitName;
import net.citizensnpcs.api.util.DataKey;
@ -40,13 +41,20 @@ import net.citizensnpcs.util.Util;
public class Text extends Trait implements Runnable, Listener {
private final Map<UUID, Long> cooldowns = Maps.newHashMap();
private int currentIndex;
@Persist
private int delay = -1;
@Persist(value = "talkitem")
private String itemInHandPattern = "default";
private final Plugin plugin;
@Persist(value = "random-talker")
private boolean randomTalker = Setting.DEFAULT_RANDOM_TALKER.asBoolean();
@Persist
private double range = Setting.DEFAULT_TALK_CLOSE_RANGE.asDouble();
@Persist(value = "realistic-looking")
private boolean realisticLooker = Setting.DEFAULT_REALISTIC_LOOKING.asBoolean();
@Persist(value = "speech-bubbles")
private boolean speechBubbles;
@Persist(value = "talk-close")
private boolean talkClose = Setting.DEFAULT_TALK_CLOSE.asBoolean();
private final List<String> text = new ArrayList<String>();
@ -139,14 +147,6 @@ public class Text extends Trait implements Runnable, Listener {
if (text.isEmpty()) {
populateDefaultText();
}
talkClose = key.getBoolean("talk-close", talkClose);
realisticLooker = key.getBoolean("realistic-looking", realisticLooker);
randomTalker = key.getBoolean("random-talker", randomTalker);
range = key.getDouble("range", range);
delay = key.getInt("delay", delay);
speechBubbles = key.getBoolean("speech-bubbles", speechBubbles);
itemInHandPattern = key.getString("talkitem", itemInHandPattern);
}
@EventHandler
@ -185,13 +185,6 @@ public class Text extends Trait implements Runnable, Listener {
@Override
public void save(DataKey key) {
key.setInt("delay", delay);
key.setBoolean("talk-close", talkClose);
key.setBoolean("random-talker", randomTalker);
key.setBoolean("realistic-looking", realisticLooker);
key.setDouble("range", range);
key.setString("talkitem", itemInHandPattern);
key.setBoolean("speech-bubbles", speechBubbles);
key.removeKey("text");
for (int i = 0; i < text.size(); i++) {
key.setString("text." + String.valueOf(i), text.get(i));
@ -224,7 +217,7 @@ public class Text extends Trait implements Runnable, Listener {
if (speechBubbles) {
HologramTrait trait = npc.getOrAddTrait(HologramTrait.class);
trait.addTemporaryLine(Placeholders.replace(text.get(index), player),
trait.addTemporaryLine(Placeholders.replace(text.get(index), player, npc),
Setting.DEFAULT_TEXT_SPEECH_BUBBLE_DURATION.asTicks());
} else {
npc.getDefaultSpeechController().speak(new SpeechContext(text.get(index), player));
@ -324,5 +317,5 @@ public class Text extends Trait implements Runnable, Listener {
return speechBubbles;
}
private static Random RANDOM = Util.getFastRandom();
private static final Random RANDOM = Util.getFastRandom();
}