版本: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"}?
命令存储中的内容:{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 ..?
你是会需要多个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 ..?
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"}]}
]
}
这算是经典特性了
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不是一个空列表或者复合标签列表,那么游戏在尝试创建新元素时,就会抛出异常,提示出现意外错误
复制过来了一些源码作为参考:
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不是一个空列表或者复合标签列表,那么游戏在尝试创建新元素时,就会抛出异常,提示出现意外错误
复制过来了一些源码作为参考:
代码:
- net/minecraft/commands/arguments/NbtPathArgument$MatchElementNode类:
 
-    public void getOrCreateTag(Tag tag, Supplier<Tag> supplier, List<Tag> list) {
 
-       MutableBoolean mutableBoolean5 = new MutableBoolean();
 
-       if (tag instanceof ListTag) {
 
-         ListTag listTag6 = (ListTag)tag;
 
-         MutableBoolean mutableBoolean6;
 
-         listTag6.stream().filter(this.predicate).forEach(tag -> {
 
-        list.add(tag);
 
-        mutableBoolean6.setTrue();
 
-        return;
 
-         });
 
-         if (mutableBoolean5.isFalse()) {//如果没有符合的元素
 
-        CompoundTag compoundTag7 = this.pattern.copy();//就是{Dimension:"minecraft:overworld"}
 
-        ((AbstractList<CompoundTag>)listTag6).add(compoundTag7);//此处创建新元素{Dimension:"minecraft:overworld"}
 
-        list.add(compoundTag7);
 
-         }
 
-       }
 
- }
chixvv 发表于 2021-7-8 18:12
这算是经典特性了
data modify如果选择了不存在的路径,就会创建这个路径
比如data modify storage telepor ...
这算是经典特性了
data modify如果选择了不存在的路径,就会创建这个路径
比如data modify storage telepor ...
你的源代码哪里下的,我 github 上不去(