inuEbisu
本帖最后由 tdiant 于 2023-3-31 11:04 编辑

如题
e.g. 使目标选择器 @e[type=!player] 返回一个 List<Entity>
希望能够达成和原版一样的效果

Edit: 主要是想要现成的可以直接用的东西,我自己好像没找着,又感觉这种东西不该没人写过(
如果需要从头到尾自己写的话,慢慢磨应该也能磨出来,但这就有点蛋疼了(

名副其实
您可能需要 PSudoCommands (

美味的曲奇
本帖最后由 美味的曲奇 于 2023-2-28 15:38 编辑

下方有人给出了更好的非NMS方法,此处仅供参考 # 2023/2/8
---
参考
net.minecraft.server.<version>.PlayerSelector
net.minecraft.server.<version>.EntitySelector
高版本为 net.minecraft.commands.arguments.selector 包下内容

teddyxlandlee
我印象中paper用了brigadier

FireworkPolymer
https://github.com/chrisgdt/PsudoCommands
这里有源码,你看看实现方法

无敌三脚猫
1.13以上有现成的Bukkit.selectEntities(CommandSender, "@e[某某参数]"),就能返回一个List<Entity>了,不用艹nms
如果只需要支持一个版本的话,我都不想用bukkit,直接在nms里注册指令就好,自带目标选择器、清晰的tab补全、格式检查
我不喜欢“支持全版本”这种主意,我觉得mythicmobs或者Multiverse Core这些插件放弃支持低版本mc是很明智的选择
毕竟
https://howoldisminecraft1710.today/
https://howoldisminecraft1122.today/

无敌三脚猫
本帖最后由 无敌三脚猫 于 2023-2-26 14:17 编辑
美味的曲奇 发表于 2023-2-26 08:37
参考
net.minecraft.server..PlayerSelector
net.minecraft.server..EntitySelector

1.12没有EntitySelector,但PlayerSelector里有个能返回Entity的方法,getEntity
而用来返回List<Entity>的方法名叫getPlayers
bukkit的奇妙命名
仔细想想其实不是方法名写错了,是类名写错了,不只方法名写错了,类名也写错了,net.minecraft.server.v1_12_R1.PlayerSelector这个类对应的是mcp1.12里的net.minecraft.command.EntitySelector

洞穴夜莺
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Bukkit.html#selectEntities(org.bukkit.command.CommandSender,java.lang.String)
Bukkit.html::selectEntities(sender, selector)
需要注意的是,这个API不检查sender是否有使用@开头的选择器的权限(除此@开头的选择器之外还有用户名和UUID选择器)。
参考代码

  1. /**
  2. * 获取选择器选择的实体列表,当选择器无效(包括没有权限)时,返回null
  3. **/
  4. @Nullable List<Entity> select(CommandSender sender, String selector) {
  5.    try {
  6.        return selector.startsWith("@") && (!sender.hasPermission("minecraft.command.selector")) ? null : Bukkit.selectEntites(sender, selector);
  7.    } catch (IllegalArgumentException ex) {
  8.        return null;
  9.    }
  10. }
复制代码