geolyzer 组件用于分析附近地形和相邻方块,常见用途包括找矿、地层采样、根据方块属性驱动自动化逻辑,以及读取 GregTech 地下流体信息。
和普通的方块查询不同,地质分析仪的大多数操作都会消耗能量;当内部缓冲不足时,调用会失败。较大的区域扫描还会受到扫描范围和总体积限制。
- 仓库:
opencomputers - 组件名:
geolyzer - 常见宿主:安装了对应硬件的电脑、机器人、平板、无人机、微控制器
local component = require("component")
local geolyzer = component.geolyzer
if not geolyzer then
error("未安装 geolyzer 组件")
end也可以使用 component.proxy(address) 访问指定地址的设备。
- 语法:
geolyzer.analyze(side[, options]) - 返回值:
- 成功:
table - 失败:
nil, reason
- 成功:
- 用途:读取宿主指定方向上、紧邻方块的扩展信息。
参数说明:
side:number:要分析的方向。options:table可选:传递给事件系统的附加分析选项。大多数脚本保持为空即可。
说明:
- 只有在 OpenComputers 配置中启用了物品栈检查时,此调用才可用。
- 该调用会消耗地质分析仪扫描能量。
- 可能返回以下失败原因:
"not enabled in config""not enough energy""scan was canceled"
示例:
local sides = require("sides")
local data, reason = geolyzer.analyze(sides.front)
if not data then
io.stderr:write("分析失败: " .. tostring(reason) .. "\n")
else
print("方块名:", data.name or "未知")
print("硬度:", data.hardness or "无")
end- 语法:
geolyzer.canSeeSky() - 返回值:
boolean - 用途:检查宿主正上方的方块空间是否与天空直通,没有被任何方块遮挡。
它适合用来做室外检测、太阳能前置判断、天气相关自动化逻辑。
示例:
if geolyzer.canSeeSky() then
print("设备上方直通天空")
else
print("设备上方被遮挡")
end- 语法:
geolyzer.isSunVisible() - 返回值:
boolean - 用途:判断当前时刻太阳是否真正照射到宿主上方。
它比 canSeeSky() 更严格,除了上方不能被遮挡外,还会受昼夜和天气影响。沙漠群系在部分天气条件下的表现也会和其他群系不同。
示例:
if geolyzer.isSunVisible() then
print("当前能接收到直射阳光")
else
print("当前没有直射阳光")
end- 语法:
geolyzer.scan(x, z[, y, w, d, h][, ignoreReplaceable|options]) - 返回值:
- 成功:
table - 失败:
nil, reason
- 成功:
- 用途:对宿主相对坐标处的一条竖直柱,或一个受限的三维区域进行密度采样。
参数说明:
x:number:相对 X 偏移。z:number:相对 Z 偏移。y:number可选:三维扫描时的起始相对 Y 偏移。w:number可选:X 方向宽度。d:number可选:Z 方向深度。h:number可选:Y 方向高度。ignoreReplaceable:boolean可选:兼容旧写法。传入true时,会在结果中过滤可替换方块。options:table可选:高级扫描选项。
行为说明:
- 只传
x和z时,会扫描一条竖直柱,范围固定为y = -32到y = 31。 - 传入
y, w, d, h时,总扫描体积不能超过64个方块。 - 请求区域内每个坐标都必须在配置允许的地质分析仪范围内。
- 该调用会消耗能量,并可能返回:
"not enough energy""scan was canceled"
- 非法请求会直接抛出错误,例如:
"volume too large (maximum is 64)""location out of bounds"
示例:扫描设备正下方和正上方的一整列数据。
local densities, reason = geolyzer.scan(0, 0)
if not densities then
io.stderr:write("扫描失败: " .. tostring(reason) .. "\n")
else
for y, hardness in ipairs(densities) do
print(y - 33, hardness)
end
end示例:从设备下方 8 格开始,扫描一个 4 x 4 x 4 立方体。
local data = assert(({geolyzer.scan(-1, -1, -8, 4, 4, 4)})[1])
print("扫描到的方块数:", #data)- 语法:
geolyzer.scanUndergroundFluids() - 返回值:
table - 用途:读取当前区块的 GregTech 地下流体信息。
返回表通常包含:
type:string:本地化后的流体名称。quantity:number:当前区块报告的储量。
只有在整合包启用了 OpenComputers 对 GregTech 地下流体系统的兼容时,这个接口才有实际意义。
示例:
local fluid = geolyzer.scanUndergroundFluids()
print("流体类型:", fluid.type)
print("储量:", fluid.quantity)- 语法:
geolyzer.store(side, dbAddress, dbSlot) - 返回值:
- 成功:
boolean - 失败:
nil, reason
- 成功:
- 用途:将相邻方块对应的物品表示写入数据库组件的指定槽位。
参数说明:
side:number:要读取的方块方向。dbAddress:string:目标数据库组件地址。dbSlot:number:数据库中的目标槽位。
返回值说明:
- 成功时,布尔值表示目标槽位原来是否已经有物品。
- 失败时,常见原因包括:
"not enough energy""block has no registered item representation"
示例:
local database = component.database
local sides = require("sides")
local replaced, reason = geolyzer.store(sides.down, database.address, 1)
if replaced == nil then
io.stderr:write("写入数据库失败: " .. tostring(reason) .. "\n")
else
print("是否替换了原有物品:", replaced)
endcomponentdatabaserobottablet