Java 传送到下一个玩家

Java 传送到下一个玩家,java,bukkit,Java,Bukkit,我正在开发一个spigot1.8.9插件,并试图添加一个功能,当工作人员右键单击一个项目时,它会将他们传送到下一个没有消失的玩家,而不是他们自己,如果没有,它应该返回null 单击时,我尝试使用将所有可能的用户添加到列表中 public static List<User> getPossibleUsers(User user){ List<User> result = new ArrayList<>(); for(User target : u

我正在开发一个spigot1.8.9插件,并试图添加一个功能,当工作人员右键单击一个项目时,它会将他们传送到下一个没有消失的玩家,而不是他们自己,如果没有,它应该返回null

单击时,我尝试使用将所有可能的用户添加到列表中

public static List<User> getPossibleUsers(User user){
    List<User> result = new ArrayList<>();
    for(User target : users)
        if(!target.isVanished() && !user.getUUID().equals(target.getUUID()))
            result.add(target);
    return result;
}

问题是我不知道如何正确地使用getNextPlayer方法并使其高效。我也希望这样,一旦它击中最后一个玩家,它就会循环回到第一个玩家。

如果你想让它高效,我建议你完全不同地思考你的问题,但在这种情况下,效率真的不是一个问题,因此,我选择不进行预成熟优化,而是使用您已有的代码

public static List<User> getPossibleUsers(User user){
    List<User> result = new ArrayList<>();
    for(User target : users)
        if(!target.isVanished() && !user.getUUID().equals(target.getUUID()))
            result.add(target);
    return result;
}
看起来您正在“用户”列表中存储玩家的索引

一旦有了它,就可以直接从列表中访问该索引

E get(int索引)

所以,做
users.get(next++)是“修复”上述代码所需的全部操作。它接着递增,并在该位置获取用户(假设顺序一致,并且没有更改),但是,如果它超出列表的范围,它可能会抛出异常,因此我们将其包装在

if(next <= users.length) {
    users.get(next++);
} else return null;

if(接下来是什么是用户?据我所知,在Spigot下不存在类,只有SpongAPI,除非它是您自己创建的类。@Ryanthelich它是一个自定义对象类,在这种情况下,如果用户消失,它会从播放器外扩展以存储额外的数据,并使用int保留其位置。我假设您实际上不是指“扩展”播放器就像在继承中一样。@RyanTheLeach哦,是的,不,我的意思是,当对象被创建时,它保存了播放器,然后我使用了该播放器对象的方法。编辑:意外地留在visitedUsers中,即使它不再被使用,并且最初从未被填充。
    int next = user.nextPlayer;
if(next <= users.length) {
    users.get(next++);
} else return null;
public class TeleportTooldata {
    private ListIterator<UUID> cursor;
    private List<UUID> cachedOrder;

    public TeleportTooldata(List<UUID> applicableUsers) {
        cachedOrder = applicableUsers;
    }

    @Nullable
    public UUID next() {
        if (!cursor.hasNext()) return null;
        UUID next = cursor.next();
        if (!cachedOrder.contains(next)) {
            cachedOrder.add(next);
        }
        return next;
    }

    public void Update(List<UUID> applicableUsers) {
        applicableUsers.removeAll(cachedOrder);
        cachedOrder.addAll(applicableUsers);
    }
}

public class TeleportToolUtil {
    YourPluginUserRepo repo;
    Map<User, TeleportTooldata> storage; //This could be a cache, make sure to remove if they log out, or maybe timed as well.

    public List<UUID> getApplicableUsers() {
        return repo.getOnlineUsers().stream()
                .filter(User::isVanish)
                .sorted(Comparator.comparing(User::getId)) // You can change the sort order
                .map(User::getId)
                .collect(Collectors.toList());
    }

    public void onToolUse(User user) {
        TeleportTooldata data = storage.computeIfAbsent(user, x -> new TeleportTooldata(getApplicableUsers()));
        UUID next = data.next();
        if (next == null) {
            data.Update(getApplicableUsers());
            next = data.next();
                if(next == null) {
                storage.put(user, new TeleportTooldata(getApplicableUsers()));
                next = data.next();
            }
        }
        user.teleportTo(next);
    }
}