<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ocr.michiyo.me/w/index.php?action=history&amp;feed=atom&amp;title=Component%2Fsignals%2Fzh</id>
	<title>Component/signals/zh - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://ocr.michiyo.me/w/index.php?action=history&amp;feed=atom&amp;title=Component%2Fsignals%2Fzh"/>
	<link rel="alternate" type="text/html" href="https://ocr.michiyo.me/w/index.php?title=Component/signals/zh&amp;action=history"/>
	<updated>2026-08-24T15:19:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://ocr.michiyo.me/w/index.php?title=Component/signals/zh&amp;diff=1201&amp;oldid=prev</id>
		<title>imported&gt;OCDoc Import: Imported from legacy OpenComputers documentation at ocdoc.cil.li</title>
		<link rel="alternate" type="text/html" href="https://ocr.michiyo.me/w/index.php?title=Component/signals/zh&amp;diff=1201&amp;oldid=prev"/>
		<updated>2026-08-24T08:08:27Z</updated>

		<summary type="html">&lt;p&gt;Imported from legacy OpenComputers documentation at ocdoc.cil.li&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= 信号 =&lt;br /&gt;
&lt;br /&gt;
信号是由某些外部来源发送给电脑的信息，可被用于各种用途。它们需要至少有个名字，然后还可以有任意数量的（简单）参数。注意，电脑自己也可以向自己的信号队列中添加信号。&lt;br /&gt;
&lt;br /&gt;
信号可以被[[API/computer/zh|computer.pullSignal()]]或其更方便的封装[[API/event/zh|event.pull()]]消耗掉。&lt;br /&gt;
&lt;br /&gt;
下面列出了所有由组件和内置库触发的信号。它们由以下格式列出：`信号名(参数名: 参数类型, ...)`，你可以用`local name, arg, ... = event.pull()`这样的写法拉取它们。 例如，要拉取一条调制解调器收到的消息： ```lua local event = require(&amp;quot;event&amp;quot;) local _, localNetworkCard, remoteAddress, port, distance, payload = event.pull(&amp;quot;modem_message&amp;quot;) print(&amp;quot;Received data &amp;#039;&amp;quot; .. tostring(payload) .. &amp;quot;&amp;#039; from address &amp;quot; .. remoteAddress .. &amp;quot; on network card &amp;quot; .. localNetworkCard .. &amp;quot; on port &amp;quot; .. port .. &amp;quot;.&amp;quot;) if distance &amp;gt; 0 then&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;print(&amp;quot;Message was sent from &amp;quot; .. distance .. &amp;quot; blocks away.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
end ```&lt;br /&gt;
&lt;br /&gt;
== 电脑 ==&lt;br /&gt;
&lt;br /&gt;
* `component_added(address: string, componentType: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当有新组件连接到系统时，[[Block/computer case/zh|电脑]]或[[Block/robot/zh|机器人]]会将此信号加入队列。`address`是新加入的组件的地址，`componentType`是组件的类型（例如`redstone`或`gpu`）。  &lt;br /&gt;
注意：请尽可能不要直接使用这个信号，而是用`component_available`代替，后者会在添加或改变**首选**组件时，被[[API/component/zh|component(组件) 库]]加入信号队列。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `component_removed(address: string, componentType: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当某组件被从系统中移除时，[[Block/computer case/zh|电脑]]或[[Block/robot/zh|机器人]]会将此信号加入信号队列。`address`是被移除的组件的地址，`componentType`是组件的类型（如 `redstone` 或 `gpu`）。  &lt;br /&gt;
注意：请尽可能不要直接使用这个信号，而是用`component_unavailable`代替，后者会在移除**首选**组件时，被[[API/component/zh|component(组件) 库]]加入队列。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `component_available(componentType: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当添加或改变**首选**组件时，[[API/component/zh|component(组件) 库]]会将这个信号加入队列。一般来说，最好使用它而不是`component_added`，以免与组件库冲突。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `component_unavailable(componentType: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当移除**首选**组件时，[[API/component/zh|component(组件) 库]]会将这个信号加入队列。一般来说，最好使用它而不是`component_removed`，以免与组件库冲突。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `term_available()`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当电脑的[[Item/graphics card/zh|GPU]]**与**[[Block/screen/zh|屏幕]]变得均可用时，[[API/term/zh|term(终端) 库]]会将这个信号加入队列。此信号有助于确定何时可以将文本输出到设备连接的屏幕上。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `term_unavailable()`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当电脑的 [[Item/graphics card/zh|GPU]]**或**[[Block/screen/zh|屏幕]]的其中任意一个变得不可用时，[[API/term/zh|term(终端) 库]]会将这个信号加入队列。此信号有助于确定何时不能将文本输出到设备连接的屏幕上。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 屏幕 ==&lt;br /&gt;
&lt;br /&gt;
* `screen_resized(screenAddress: string, newWidth: number, newHeight: number)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当分辨率发生变化，例如通过[[Component/GPU/zh|GPU]]手动修改分辨率时，对应的[[Block/screen/zh|屏幕]]会将此信号加入队列。`screenAddress`是产生信号的屏幕的地址。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `touch(screenAddress: string, x: number, y: number, button: number, playerName: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;此信号会在2级或3级屏幕被点击时入队。包括左键点击GUI（连接键盘时），或在世界中直接右键点击它们/与其交互（没有键盘连接或潜行交互时）。  &lt;br /&gt;
`screenAddress`是产生信号的屏幕的地址。`x`和`y`坐标的单位是“字母”（意味着它们直接映射到`term.setCursor`或`gpu.set`）。`playerName` 是触发这个事件的玩家的名字。  &lt;br /&gt;
关于玩家名的说明：我可能会在将来添加一个配置项来禁用这个参数，因为有些人认为这太……不真实了。但它对多用户程序很有用，因此我暂时保留了它。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注意：&amp;#039;&amp;#039;&amp;#039;此信号是&amp;#039;&amp;#039;&amp;#039;已经过核查&amp;#039;&amp;#039;&amp;#039;的，也就是说，只有当玩家是该电脑的[[computer users/zh|登记用户]]（或该电脑没有登记任何用户）时，信号才会入队。&lt;br /&gt;
* `drag(screenAddress: string, x: number, y: number, button: number, playerName: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;此信号几乎等同于 `touch` 信号，唯一隐含的区别是： 此信号被触发时，其实是“属于”先前已被触发的`touch`信号的。此信号只能通过在GUI中进行拖动来触发。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `drop(screenAddress: string, x: number, y: number, button: number, playerName: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;此信号在玩家触发`touch`后松开鼠标时被触发。尽管它叫这个名字，但它不必需跟在`drag`信号之后。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `scroll(screenAddress: string, x: number, y: number, direction: number, playerName: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当玩家在2级或3级屏幕的GUI中使用鼠标滚轮时，对应屏幕会将此信号加入队列。  &lt;br /&gt;
`x`和`y`坐标的值为滚动时鼠标光标的位置。与`touch`信号相同，坐标以“字母”为单位。`direction`表示滚动的方向，正数代表“向上”，负数代表“向下”。注意，这可能会根据游戏客户端的操作系统或驱动配置而有所不同。`playerName`是触发该事件的玩家名字。&lt;br /&gt;
对于玩家名，此处也有与`touch`处相同的考虑。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `walk(screenAddress: string, x: number, y: number[, playerName: string])`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当玩家或其他实体在2级或3级屏幕上行走时，对应屏幕会将这个信号加入信号队列。`screenAddress`是产生信号的屏幕的地址。`x`和`y`坐标是当屏幕为多方块屏幕时**子方块的坐标**。使用[[Component/GPU/zh|gpu.getSize()]]可以计算出实际上代表了显示器的哪个区域。  &lt;br /&gt;
与点击不同的是，根据当前的分辨率不同，这个信号可能会被屏幕上没有任何显示的区域触发，所以要记住这一点。&lt;br /&gt;
对于玩家名，此处也有与`touch`处相同的考虑。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 键盘 ==&lt;br /&gt;
&lt;br /&gt;
* `key_down(keyboardAddress: string, char: number, code: number, playerName: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当用户在屏幕上输入内容时，附着其上的[[Block/keyboard/zh|键盘]]会将此信号添加到队列中。准确来说，应该是当用户**按下**一个键时。如果用户一直按着这个键，这个事件可能会被重复触发。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注意：&amp;#039;&amp;#039;&amp;#039;此信号&amp;#039;&amp;#039;&amp;#039;已经过核查&amp;#039;&amp;#039;&amp;#039;，也就是说，只有当玩家是该电脑的[[computer users/zh|登记用户]]（或该电脑没有登记任何用户）时，信号才会入队。&lt;br /&gt;
* `key_up(keyboardAddress: string, char: number, code: number, playerName: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当用户在屏幕上输入内容时，附着其上的[[Block/keyboard/zh|键盘]]会将此信号添加到队列中。准确来说，应该是当用户**松开**一个键时。&lt;br /&gt;
请注意，玩家可以不松开按键就将自己“移开”屏幕范围，这在大多数情况下**应该**会得到处理（我认为），但有时仍会处理失败。这意味着该功能或多或少还处于……观察阶段，若被证明不可行，该功能会在以后的某个时间点被删除。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注意：&amp;#039;&amp;#039;&amp;#039;此信号&amp;#039;&amp;#039;&amp;#039;已经过核查&amp;#039;&amp;#039;&amp;#039;，也就是说，只有当玩家是该电脑的[[computer users/zh|登记用户]]（或该电脑没有登记任何用户）时，信号才会入队。&lt;br /&gt;
* `clipboard(keyboardAddress: string, value: string, playerName: string)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当用户从剪切板上粘贴文本（shift+ins或鼠标中键）时，[[Block/keyboard/zh|键盘]]会将此信号添加到信号队列。请注意，文本可粘贴的最大长度是有限制的（可在配置文件中修改）。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注意：&amp;#039;&amp;#039;&amp;#039;此信号&amp;#039;&amp;#039;&amp;#039;已经过核查&amp;#039;&amp;#039;&amp;#039;，也就是说，只有当玩家是该电脑的[[computer users/zh|登记用户]]（或该电脑没有登记任何用户）时，信号才会入队。&lt;br /&gt;
&lt;br /&gt;
== 红石卡与红石I/O端口 ==&lt;br /&gt;
&lt;br /&gt;
* `redstone_changed(address: string, side: number, oldValue: number, newValue: number[, color: number])`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当传入的红石信号改变时，[[Component/redstone/zh|红石组件]]会将此信号添加到队列。  &lt;br /&gt;
`address`是[[Block/redstone io/zh|红石I/O端口]]或检测到红石信号的机器安装的[[Item/redstone card/zh|红石卡]]的地址。`side`是[[API/sides/zh|sides（方向）]]常量的其中之一，表示哪一侧的红石信号发生了变化。这里的方向是相对于组件容器的相对方向，因此对电脑和机器人而言，具体的值取决于它们的朝向。对于红石I/O端口来说，方向是绝对的。`color`参数只有在配合集束线缆使用时才会引入，其值表示发生改变的信号的颜色。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 运动传感器 ==&lt;br /&gt;
&lt;br /&gt;
* `motion(address:string, relativeX:number, relativeY:number, relativeZ:number[, entityName:string])`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当检测范围内的活动实体移速超过配置的灵敏度时，这个信号会被[[Block/motion sensor/zh|运动传感器]]添加到事件队列。`relativeX`、`relativeY`和`relativeZ`是被检测到的物体相对于运动传感器的位置。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 网卡 ==&lt;br /&gt;
&lt;br /&gt;
* `modem_message(receiverAddress: string, senderAddress: string, port: number, distance: number, ...)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当在开放的端口上收到信息时，[[Item/network card/zh|网卡]]（包括无线网卡）会将此信号添加到事件队列。  &lt;br /&gt;
`receiverAddress` 是收到信息的网卡的地址，`senderAddress`是发送信息的网卡的地址。注意，若信息经过了一个或多个[[Block/switch/zh|中继器]]，那么发送者的地址可能与实际发送信息的网卡地址不同。`port`是收到信息的端口。`distance`参数只有在收到**无线**网络信息时才有效，此时它的值是接收者到发送者之间的距离。对于普通的网卡来说，该值永远为零。其他所有参数都是用户定义的，并对应用户在调用[[Component/modem/zh|modem.send()]] 或 `modem.broadcast()`时指定的内容，为信息载荷。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 机器人 ==&lt;br /&gt;
&lt;br /&gt;
* `inventory_changed(slot: number)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;当机器人的物品栏发生变化时，机器人会将此信号添加到队列。注意，只包括储存在槽位中的物品种类变化。增加或减少一个物品堆中的物品数量并不会触发这个信号。  &lt;br /&gt;
玩家手动将机器人库存中的一种物品换成另一种（例如火把和木棍）时实际上会触发**两个**信号：一个是移除火把的信号，一个是与此同时放入木棍的信号。使用[[API/robot/zh|robot.transferTo()]]交换两个槽位中的物品甚至会触发**四个**信号——原因同上，但这次涉及到两个槽位间的物品交换。  &lt;br /&gt;
此外，该信号只针对机器人物品栏中有地址的部分，也就是说，它不会因装备（工具、扩展卡、升级）的变化而被触发。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 抽象总线卡 ==&lt;br /&gt;
&lt;br /&gt;
来自[Stargate Tech 2](http://stargatetech.theender.net/miscellaneous/home.html)。&lt;br /&gt;
&lt;br /&gt;
* `bus_message(protocolId: number, senderAddress: number, targetAddress: number, data: table, metadata: table)`&lt;br /&gt;
&lt;br /&gt;
# `protocolId`是所使用的协议的版本。&lt;br /&gt;
# `senderAddress`是发送信息的设备地址。&lt;br /&gt;
# `targetAddress`是信息的目标设备地址（网络广播为 -1）。&lt;br /&gt;
# `data`是包含所发送数据的表。&lt;br /&gt;
# `metadata`是特定于发送方设备的数据的表。&lt;br /&gt;
&lt;br /&gt;
== 车辆 ==&lt;br /&gt;
&lt;br /&gt;
来自[Redstone in motion / remain in motion（红石运动机构）](https://www.curseforge.com/minecraft/mc-mods/remain-in-motion)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;&amp;#039;&amp;#039;&amp;#039;注意：&amp;#039;&amp;#039;&amp;#039;该组件的驱动程序已被移动到附属模组OpenComponents中。&amp;lt;/s&amp;gt; OpenComponents模组的内容已合并进主模组。&lt;br /&gt;
&lt;br /&gt;
* `carriage_moved(success: boolean[, reason:string[, x:number, y: number, z: number]])`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;此信号会在车辆组件成功执行移动或模拟移动命令后加入队列。`success`参数指出移动或模拟移动指令是否执行成功，即车辆是否可移动。若移动失败，`reason`即为错误信息。取决于错误信息，（`x`,`y`,`z`）会是造成移动失败的方块在世界中的坐标。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 目录 ==&lt;br /&gt;
&lt;br /&gt;
{{:Component/contents/zh}}&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;OCDoc Import</name></author>
	</entry>
</feed>