信号是一些外部源发送给计算机的信息,可被用于各种用途。它们需要至少有个名字,然后还可以有任意数量的(简单)参数。注意,电脑也可以向自己的信号队列中添加信号。
信号可以通过调用 computer.pullSignal() 或它的简单封装 event.pull() 来消耗。
下面列出了所有由组件和内置库触发的信号。它们由以下格式列出:name(arg: type, ...)
,你可以像 local name, arg, ... = event.pull()
这样拉取它们。例如,要拉取一条调制解调器的消息:
local event = require("event") local _, localNetworkCard, remoteAddress, port, distance, payload = event.pull("modem_message") print("在网卡 ‘" .. localNetworkCard .. "’ 的 ‘" .. port .. "’ 端口上收到来自 ‘" .. remoteAddress .. "’ 地址的数据:" .. tostring(payload)) if distance > 0 then print("消息来自 " .. distance .. " 格远。") end
component_added(address: string, componentType: string)
address
是新加入的组件的地址,componentType
是组件的类型(如 redstone
或 gpu
)。component_available
代替,后者会在首选组件被添加或改变时,被component(组件) 库加入信号队列。component_removed(address: string, componentType: string)
address
是被移除的组件的地址,componentType
是组件的类型(如 redstone
或 gpu
)。component_unavailable
代替,后者会在首选组件被移除时,被component(组件) 库加入信号队列。component_available(componentType: string)
component_added
,以免与组件库冲突。component_unavailable(componentType: string)
component_removed
,以免与组件库冲突。touch(screenAddress: string, x: number, y: number, button: number, playerName: string)
screenAddress
是产生信号的屏幕的地址。x
和 y
的坐标数值是以“字母”为单位的(这意味着它直接映射到 term.setCursor
或 gpu.set
)。playerName
是触发这个事件的玩家的名字。
关于玩家名的说明:我可能会在将来添加一个配置项来禁用这个参数,因为有些人认为这太……出戏了。它对多用户程序很方便,因此我暂时保留了它。
重要:这个信号是被检查过的,也就是说,只有当玩家是该电脑的注册用户(或该电脑没有注册任何用户)时,信号才会入队。drag(screenAddress: string, x: number, y: number, button: number, playerName: string)
touch
信号,唯一隐含的区别是: 当这个信号被触发时,它是“属于”先前已被触发的 touch
信号的。此信号只能通过在GUI中进行拖动来触发。drop(screenAddress: string, x: number, y: number, button: number, playerName: string)
touch
后松开鼠标时被触发。尽管它叫这个名字,但它不一定在 drag
信号之后。scroll(screenAddress: string, x: number, y: number, direction: number, playerName: string)
x
和 y
坐标数值为滚动时鼠标光标的位置。跟 touch
信号一样,坐标以“字母”为单位。direction
表示滚动的方向,正数代表“向上”,负数代表“向下”。注意,这可能会根据用户现实电脑的操作系统或驱动配置而有所不同。playerName
是触发该事件的玩家的名字。
这里有与 touch
中相同的关于玩家名的考虑。walk(screenAddress: string, x: number, y: number[, playerName: string])
screenAddress
是产生信号的屏幕的地址。x
和 y
坐标是当屏幕为多方块屏幕时子方块的坐标。使用 gpu.getSize() 可以计算出实际上代表了显示器的哪个区域。
与点击不同的是,根据当前的分辨率,这个信号可能会被屏幕上没有任何显示的区域触发,所以要记住这一点。
这里有与 touch
中相同的关于玩家名的考虑。redstone_changed(address: string, side: number, oldValue: number, newValue: number[, color: number])
address
是红石 I/O 端口或被安装在检测到红石信号的机器上的红石卡的地址。side
是sides内的一个常数,表示红石信号在哪一侧发生变化。这个方向是相对于组件的容器的,因此对于计算机和机器人来说,具体的值取决于它们的朝向。对于红石 I/O 端口来说,方向是绝对的。color
只会在输入是包装过的时存在,其值表示发生改变的信号的颜色。motion(address:string, relativeX:number, relativeY:number, relativeZ:number[, entityName:string])
relativeX
、relativeY
和 relativeZ
是被检测到的物体相对于运动传感器的位置。modem_message(receiverAddress: string, senderAddress: string, port: number, distance: number, ...)
receiverAddress
是收到消息的网卡的地址,senderAddress
是发送消息的网卡的地址。注意,如果消息经过了一个或多个中继器,那么发送者的地址可能与实际发送消息的网卡的地址不同。port
是收到消息的端口。distance
只有收到无线网络信息时才有效,此时它的值是接收者到发送者之间的距离。对于普通的网卡来说,这个值将永远是零。其他所有参数都是用户定义的,并与 modem.send() 或 modem.broadcast()
中附加的信息相对应。inventory_changed(slot: number)
bus_message(protocolId: number, senderAddress: number, targetAddress: number, data: table, metadata: table)
protocolId
是所使用的协议的版本。senderAddress
是发送消息的设备的地址。targetAddress
是消息所指向的设备的地址(网络广播为 -1)。data
是发送的数据的表。metadata
是发送者设备所特有的数据的表。重要: 这个组件已经被移动到 OpenComponents addon。
carriage_moved(success: boolean[, reason:string[, x:number, y: number, z: number]])
success
参数指出物品移动或者指令模拟是否成功,例如,运载工具是否被移动了。如果移动失败,reason
包含的就是错误信息。取决于错误信息,(x
, y
, z
)会是造成移动失败的方块在世界中的坐标。