标记实体(Marker)

命令里有很多地方都需要使用实体,如execute命令,相对坐标(作为参照点),储存数据等等。
我们会使用标记实体(Marker)做到两个主要用途:标记坐标以及储存数据。当然,有时候是同时进行的。

标记坐标

命令系统里一般不会有太多绝对坐标,这是为了让系统更有弹性,能应付各种情况。
然而我们使用相对坐标的时候也需要有一个参照点啊!没法用别的参照点的话就和绝对坐标没分别了,甚至更为复杂。
因此,我们会使用marker标记某些坐标,然后execute那个marker执行某些命令,那样相对坐标就是相对于那个marker了。

例子

我们以自定义“合成台”为例子,其实就是个投掷器(Dropper)。

我们如果要检测“合成台”内的物品,我们需要得知该方块坐标,一般我们会在方块的位置放置marker,然后执行以下命令:

execute @e[type=area_effect_cloud,name=craft] ~ ~ ~ testforblock ~ ~ ~ minecraft:dropper * {Items:[]}

其实就是让marker检测自己位置的方块。

进阶
有时候我们会让marker移动来检测不同地方,达到类似扫描的效果。

储存数据

虽然假名也能储存分数,然而假名不能批量操作(并且要通过筛选),也不能execute命令。故此有时候我们是会用marker来储存分数的。
比如之前循环的部分,我们很多时是使用一个marker来储存分数的,因为我们能够很方便的选择到那个marker和检测分数。

例子

我们可以利用marker来实现Stack,不停放资料进去,最早放进去的最迟被人移除。(想知道更多有关stack的资料可以去百度/Google)

我们会有个变量叫id,id越大越早放进去,1分就是当前最后一个marker。(这是为了方便)
所有marker都是area_effect_cloud,叫marker

首先我们要写加入数据的

# stack:push
summon area_effect_cloud ~ ~ ~ {CustomName:marker}
scoreboard players add @e[type=area_effect_cloud,name=marker] id 1

# 慢慢为id=1的marker加入数据

然后写移除数据的...

# stack:pop
kill @e[type=area_effect_cloud,name=marker,score_id=1,score_id_min=1]
scoreboard players remove @e[type=area_effect_cloud,name=marker] id 1

之后的 登录系统例子 就是使用了这个概念。

results matching ""

    No results matching ""