组件:物品栏控制器 ========================== **组件名:**`inventory_controller` 此组件由[[item:inventory_controller_upgrade:zh|物品栏控制器升级]]提供。 有了此API,机器人可以接收有关物品或物品栏的额外信息,并且可以向指定槽位放入物品或从中取出物品。 大多数操作所需的方向(side)遵循[[api:sides:zh|Sides(方向面) API]]中的方向。若不指定方向或指定错误的方向,函数通常会报错。要与机器人自身的物品栏互动需要使用`back`方向,这也使得机器人无法与在其身后的物品容器互动。机器人也不能访问它们的左右两边。综上,你只能与机器人前方、上方或下方的物品容器互动。 回调函数: - `getInventorySize(side: number): number or nil[, string]` 返回指定方向所对物品容器的大小。 **side** - 须为某个有效的方向。 **返回值:**物品容器的大小,或者`nil`与函数执行失败原因的描述(通常为`no inventory`,代表对应方向不存在物品容器)。 \\ - `getStackInSlot(side:number, slot:number):table` 返回一个描述指定槽位中物品信息的表,或`nil`。用此函数获取机器人自身物品栏中物品信息的做法已经过时,请使用`getStackInInternalSlot`代替。 **side** - 须为某个有效的方向。 **slot** - 要分析的槽位。此参数不会检查物品容器大小,而是会将超出物品栏范围的槽位当作空槽位。 **返回值:**若槽位为空(或超出物品栏范围)则返回`nil`,否则返回一个表,其中包含槽位中物品的以下信息: - **damage**:number - 物品的当前损害值。 - **maxDamage**:number - 此物品在损坏前能承受的最大损害值。 - **size**:number - 此物品的当前堆叠数量。 - **maxSize**:number - 此物品的最大堆叠数量。 - **id**:number - 此物品的Minecraft id。请注意只有在配置文件中设置`insertIdsInConverters=true`才会出现此字段,可能因服务端设定而不同! - **name**:string - **“未翻译的”**物品名,也就是Minecraft的内部值,例如`oc:item.FloppyDisk`。 - **label**:string - **“翻译后的”**物品名。 - **hasTag**:boolean - 此物品是否包含NBT标签。\\ \\ - `getStackInInternalSlot(slot:number):table` 获取机器人物品栏中指定(若不指定为当前选中)槽位中物品的物品堆信息。 \\ - `dropIntoSlot(side:number, slot:number[, count:number]):boolean[, string]` 从机器人物品栏的当前选中槽位向外转移物品,目标为指定方向处物品容器的指定槽位,至多指定数量个。 **side** - 某个有效方向。 **slot** - 要放置物品的目标槽位。 **count** - 要转移多少物品。 **返回值:**若至少移动了一个物品则返回`true`,否则返回`false`与报错信息。 请注意此函数中机器人不能将物品放入自身物品栏,试图这样做会抛出错误。你需要使用[[api:robot:zh|Robot(机器人) API]]中的`robot.transferTo`函数来进行此操作。 \\ - `suckFromSlot(side:number, slot:number[, count:number]):boolean` 从指定方向处物品容器的指定槽位获取物品,转移到机器人物品栏的当前选中槽位,至多指定数量个。 **side** - 某个有效方向。 **slot** - 用于获取物品的槽位。 **count** - 要转移多少物品。 **返回值:**若至少移动了一个物品则返回`true`,否则返回`false`。 若机器人物品栏的当前选中槽位被占用,则传入的物品会被合并到物品栏中的相同物品堆中,或移动到下一个空闲槽位(有的话)。若没有可用槽位则操作会失败。 请注意此函数中给机器人不能从自身物品栏提取物品,试图这样做会抛出错误。你需要使用[[api:robot:zh|Robot(机器人) API]]中的`robot.transferTo`函数来进行此操作。 \\ - `equip():boolean` 将机器人工具槽位中内容与其物品栏的选中槽位中内容互换。 **返回值:**若物品成功交换则返回`true`,否则返回`false`。此操作通常都会成功。 请注意,你可以将任何类型的物品放进机器人的工具槽位,不只是工具,就算是机器人根本不能使用的物品也行。 \\ - `store(side:number, slot:number, dbAddress:string, dbSlot:number):boolean` 获取指定方向处物品容器指定槽位的物品堆信息,将其存入指定地址对应数据库的指定槽位。 \\ - `storeInternal(slot:number, dbAddress:string, dBslot:number):boolean` 获取机器人物品栏指定槽位的物品堆信息,将其存入指定地址对应数据库的指定槽位。 \\ - `compareToDatabase(slot:number, dBaddress:string, dBslot:number):boolean` 获取机器人物品栏指定槽位的物品堆信息,与指定地址对应数据库的指定槽位内容对比。若物品信息相符则返回`true`。 \\ - `compareStacks(side:number, slotA:number, slotB:number):boolean` 检查指定方向处物品容器中,槽位A(slotA)和槽位B(slotB)的物品信息是否相同。若相同则返回`true`。 \\ - `getSlotMaxStackSize(side:number, slot:number):number` 获取指定方向处物品容器的指定槽位中物品的堆叠上限。 \\ - `getSlotStackSize(side:number, slot:number):number` 获取指定方向处物品容器的指定槽位中物品的数量。 样例: 输出[[http://ocdoc.cil.li/api:robot:zh|slot]]所指示位置的物品元数据。 ```lua local component = require("component") local sides = require("sides") local slot = 1 local item = component.inventory_controller.getStackInInternalSlot(slot) if item then print("Item name: ", item.name) print("Item count: ", item.size) print("Item damage: ", item.damage) else print("Slot " .. slot .. " is empty") end ``` ` 目录 --------------------------- {{page>component:contents:zh&noheader&noeditbutton&nouser&nofooter}}