(=°ω°)丿
版本:1.16.5


命令存储中的内容:{Player:[{Point:[]}]}


使用命令:data modify storage teleport:data Player[].Point[{Dimension:"minecraft:overworld"}].Dimension set value "minecraft:the_nether"


使用了命令后的命令存储:{Player:[{Point:[{Dimension:"minecraft:the_nether"}]}]}


我的目的是将 Player 列表内所有元素(复合标签)中的 Point 列表内所有满足 {Dimension:"minecraft:overworld"} 的元素的 Dimension 修改为 "minecraft:the_nether"


显然,Point 列表内没有任何元素,那么为什么在使用了命令后 Point 列表内会出现新的元素 {Dimension:"minecraft:the_nether"}



阴阳师元素祭祀
你的Point为什么会是[]?
你是会需要多个Dimension么
另外那个参数实质是path(大概)




/data modify storage s:d Player[].Point{Dimension:"minecraft:overworld"}.Dimension set value "minecraft:the_nether"


这种会在Dimension是overworld的时候改成the_nether
如果那个Point[]是故意的 你可以试试execute if data ..?



(=°ω°)丿
阴阳师元素祭祀 发表于 2021-7-8 13:08
你的Point为什么会是[]?
你是会需要多个Dimension么
另外那个参数实质是path(大概)

Point 是一个列表。


一个简化后的 storage,我的目的是把所有的 {Dimension:"minecraft:overworld"} 修改为 {Dimension:"minecraft:the_nether"}


{
Player:[
    {Point:[{Dimension:"minecraft:overworld"},{Dimension:"minecraft:the_end"}]},
    {Point:[{Dimension:"minecraft:the_nether"},{Dimension:"minecraft:the_end"}]},
    {Point:[{Dimension:"minecraft:overworld"},{Dimension:"minecraft:the_nether"}]}
]
}

chixvv
这算是经典特性了
data modify如果选择了不存在的路径,就会创建这个路径
比如data modify storage teleport:data A set value "a"如果A不存在也可以执行
所以对于Player[].Point[{Dimension:"minecraft:overworld"}],因为Point列表里没有符合{Dimension:"minecraft:overworld"}的元素,所以会在列表里创建一个新元素,而且新元素是{Dimension:"minecraft:overworld"}


所以不能使用[复合标签]这种方式去匹配元素。因为只要没有元素符合条件,它就会创建新元素


顺便一提,如果Point不是一个空列表或者复合标签列表,那么游戏在尝试创建新元素时,就会抛出异常,提示出现意外错误



复制过来了一些源码作为参考:

代码:

  1. net/minecraft/commands/arguments/NbtPathArgument$MatchElementNode类:
  2.   public void getOrCreateTag(Tag tag, Supplier<Tag> supplier, List<Tag> list) {
  3.    MutableBoolean mutableBoolean5 = new MutableBoolean();
  4.    if (tag instanceof ListTag) {
  5.     ListTag listTag6 = (ListTag)tag;
  6.     MutableBoolean mutableBoolean6;
  7.     listTag6.stream().filter(this.predicate).forEach(tag -> {
  8.   list.add(tag);
  9.   mutableBoolean6.setTrue();
  10.   return;
  11.     });
  12.     if (mutableBoolean5.isFalse()) {//如果没有符合的元素
  13.   CompoundTag compoundTag7 = this.pattern.copy();//就是{Dimension:"minecraft:overworld"}
  14.   ((AbstractList<CompoundTag>)listTag6).add(compoundTag7);//此处创建新元素{Dimension:"minecraft:overworld"}
  15.   list.add(compoundTag7);
  16.     }
  17.    }
  18.   }




(=°ω°)丿
chixvv 发表于 2021-7-8 18:12
这算是经典特性了
data modify如果选择了不存在的路径,就会创建这个路径
比如data modify storage telepor ...

你的源代码哪里下的,我 github 上不去(