组件:地址分析仪

此组件由地址分析仪方块提供。

组件名:geolyzer

回调函数:

  • scan(x:number, z:number[, y:number, w:number, d:number, h:number][, ignoreReplaceable:boolean|options:table]):table
    分析位于xzy指定的相对坐标处一定区域的密度。此函数将会返回一个列表,其中包含指定范围内方块的硬度值。提供的坐标是以地址分析仪为参考点的相对坐标。待分析区域的大小由参数wdh指定,分别代表宽度(width)、深度(depth)与高度(height)。若不指定大小则认为区域为指定坐标对应的单个方块。

    方块离地址分析仪越远,扫描到的硬度值所含的噪声就会越大。计算某个值与特定方块实际硬度值偏离程度的准确公式是:到方块的欧几里得距离 * 1/33 * 地质分析仪噪声,公式中的地质分析仪噪声(geolyzerNoise)常数可通过配置文件修改,默认为2

    包含多个结果的表中的数据是线性的,但是结果所代表的是一个3D的区域。区域起始于由相对于地址分析仪的相对坐标(xzy)定义的方块,其大小(wdh)决定了区域分别在坐标轴的x轴正方向、z轴正方向和y轴正方向上延伸的方块数。将结果表中的元素与坐标对应起来需要用到以下方法:

    表中元素首先沿x轴正方向排列,然后是z轴正方向,最后是y轴正方向。换言之,假设结果表是将三维表转化成一维表得到的,那么三维表的最后一维中是按照x轴正方向排列的数值,中间一维是按照z轴正方向排列的,最高一维是按照y轴正方向排列的。可查看底部的一段代码样例以帮助理解。

    注意:偏移量在方向上是绝对的,不受面向方向的影响。换句话说,如果地质分析仪安装在机器人中,偏移量不会受到机器人朝向的影响。
    注意:返回的数值一定为64个,即使扫描区域的体积不足64也是如此。假设扫描了10个方块,那么扫描结果中的前10个值就代表了被扫描的方块,而扫描结果中剩下的值应当被忽略。

  • analyze(side:number[, options:table]):table
    获取某个直接接触地址分析仪的方块的信息。默认情况下返回的表中将包含字符串格式的方块ID(如minecraft:dirt、元表、硬度以及一些其他信息)请注意调用一次该函数消耗的能量与调用scan函数相同!
    此方法可通过配置文件中的misc.allowItemStackInspection设置项禁用。

  • store(side:number, dbAddress:string, dbSlot:number):boolean
    读取与地址分析仪指定面接触的方块信息,并将其以物品堆的形式存储到指定地址对应的数据库组件中的指定槽位。此函数不一定能(很好的)处理所有方块,尤其是以NBT数据区分的模组方块(例如机器人)。

  • detect(side:number):boolean, string
    robot.detect(来自机器人组件)相同。探测指定方向的方块,方向是机器人的相对方向,并返回机器人可否移动到此方块的位置中,同时给出方块的大体描述。
    返回值:若机器人前方的物体会阻碍机器人移动(为方块或实体)则返回 true(注意:无人机即使在方块为passable时也会返回true),在其他情况下会返回false。第二个参数大体描述了遣返的物体,取值可能为下列之一:entitysolidreplaceableliquidpassableair

  • canSeeSky():boolean
    返回从当前位置垂直向上是否能看到天空。透明方块,例如玻璃,不会影响视线。

  • isSunVisible():boolean
    返回从当前位置垂直向上是否能看到太阳。结果受到正上方能阻碍视线的方块(可由canSeeSky()函数检查)以及当前为白天还是黑夜影响。

下列代码片段可用于理解scan函数实际如何工作。它会扫描指定偏移处指定大小的区域,保存返回的数据以及相对于地质分析仪方块(或机器人)的准确偏移坐标,并打印这些数据。

local component = require("component")
local geolyzer = component.geolyzer
 
local offsetx = 4
local offsetz = -3
local offsety = -5
 
local sizex = 3
local sizez = 4
local sizey = 5
 
local map = {}
local scanData = geolyzer.scan(offsetx, offsetz, offsety, sizex, sizez, sizey)
local i = 1
for y = 0, sizey - 1 do
    for z = 0, sizez - 1 do
        for x = 0, sizex - 1 do
            -- 可看作是三维表:map[offsety + y][offsetz + z][offsetx + x] = scanData[i]
            map[i] = {posx = offsetx + x, posy = offsety + y, posz = offsetz + z, hardness = scanData[i]}
            i = i + 1
        end
    end
end
 
for i = 1, sizex*sizez*sizey do
    print(map[i].posx, map[i].posy, map[i].posz, map[i].hardness)
end

目录