Java 传送到下一个玩家
我正在开发一个spigot1.8.9插件,并试图添加一个功能,当工作人员右键单击一个项目时,它会将他们传送到下一个没有消失的玩家,而不是他们自己,如果没有,它应该返回null 单击时,我尝试使用将所有可能的用户添加到列表中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
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);
}
}