Drone(无人机实体)
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | opencomputers:Drone(FML 注册名 Drone,mod 域 opencomputers 全小写) |
| 实体类 | li.cil.oc.common.entity.Drone(不叫 EntityDrone —— 本 fork 仓内没有 EntityDrone 这个类) |
| 实体 ID | 0 |
| 跟踪范围 / 更新频率 | 80 / 1 tick,发送速度更新 |
| 碰撞箱 | setSize(12/16f, 6/16f) = 0.75 × 0.375 格 |
| 免疫火焰 | 是(isImmuneToFire = true) |
| 重力 | 0.05 |
| 空气阻力 | 0.8 |
| 最大速度 | 0.4 格/刻 |
| 最大加速度 | 0.1 格/刻² |
| 物品栏 | 最多 8 格(maxInventorySize = 8) |
注册真源:common/Proxy.scala:101
EntityRegistry.registerModEntity(classOf[Drone], "Drone", 0, OpenComputers, 80, 1, true)
这是本 mod 唯一注册的实体(全仓仅此一处 registerModEntity)。
概述
Drone 是可移动的内嵌计算机。它自带一套完整的计算机环境(CPU / 内存 / GPU / 组件总线),由 OpenOS 或其他 OpenOS 兼容程序控制,在世界中自主移动、挖掘、放置方块。
组件与物品栏
- 内部组件槽来自
DroneData.components;getSizeInventory直接返回组件数(common/entity/Drone.scala:83)。 - 无人机自身另有 8 格主物品栏(
Drone.scala:57maxInventorySize = 8,:113Array.fill[Option[ItemStack]](8)(None))。 - 装上 Fluid Tank 升级后可携带流体。
出现方式
⚠️ 无人机实体不是「用 Drone Case 直接生成」的 —— 这条原 wiki 说法有误。真实流程是两步:
- 组装:在 组装机 中用 Drone Case(
droneCase1/droneCase2/droneCaseCreative,见 dronecase)+ 组件 + EEPROM 组装出opencomputers:drone物品。该物品showInItemList = false且NEI.hide(this)(common/item/Drone.scala:18-20),在物品列表与 NEI 中都不可见。 - 放置实体:玩家手持该
drone物品右键方块,item/Drone.scala:36-53的onItemUse才会new entity.Drone(world)→initializeAfterPlacement→spawnEntityInWorld,并把玩家名 / UUID 记为 owner。
移动与物理
- 低重力(0.05)导致下落缓慢;速度与加速度都被硬性钳制在
maxVelocity/maxAcceleration。 - 阻力分两种:运行中三分量统一
*= drag(:443-445);停止时水平分量还要乘下方方块的slipperiness(:448-450),着地时垂直分量额外*= -0.5(反弹)。 - 目标位置由 Lua 侧设置,内部走
targetAcceleration(:277、:320,写入 dataWatcher 槽 6)。
交互
| 触发 | 行为 | 源码 |
|---|---|---|
| 右键(不潜行) | 打开无人机 GUI | Drone.scala:486-488 |
| 潜行 + 右键(手持扳手) | kill() 回收无人机 |
Drone.scala:476-480 |
| 潜行 + 右键(非扳手,机器未运行) | start() 启动 |
Drone.scala:482-484 |
| 被其他实体撞击 | 沿撞击反方向反弹(motion -= direction,再 * 0.5)并向 Lua 发 hit 信号 |
Drone.scala:458-471 |
hit 信号参数为方向向量 x, z, y;当配置项 Settings.get.inputUsername 为真时,额外追加撞击者用户名作为第 4 个参数(:462-465)。
状态
- 运行中:执行 OpenOS 程序,受
maxVelocity/maxAcceleration约束。 - 停止:机器已停,改为受方块
slipperiness影响的下落。 - 步态音效被静音(
func_145780_a仅在EventHandler.isItTime时放行,:493-495)。
第三方集成
| 集成 Mod | 集成类型 | 功能 |
|---|---|---|
| ComputerCraft | 外设/媒体 | CC 外设和媒体驱动 |
| CoFH / Thermal Expansion | RF 能量 | 能量处理器驱动 |
| IC2 | EU 能量 | EU 能量驱动 |
| GregTech | 能量容器 | BEC / 能量容器驱动 |
| MineFactory Reloaded | SAFARIAIR / DSU | SafariNet 和 DSU 驱动 |
| Forestry | 蜜蜂/分析器 | 蜜蜂和分析器驱动 |
| Applied Energistics 2 | ME 网络 | ME 存储/接口/总线驱动 |
| Thaumcraft | 要素容器 | 要素容器和灌注矩阵驱动 |
相关条目
- 组装机 - 组装出
drone物品的方块 - 飞走了(drone 成就) - 在组装机中组装无人机解锁
- Drone Case - 组装无人机的外壳物品
已订正:
- 原「注册名」写作
opencomputers.drone—— 分隔符错。FMLregisterModEntity传的名字是"Drone",域由 modidOpenComputers小写化成opencomputers,合成opencomputers:Drone(ResourceLocation 全小写后落为opencomputers:drone),不是点号形式。- 原条目通篇暗示实体类名是
EntityDrone—— 仓内没有EntityDrone.scala,真实类是li.cil.oc.common.entity.Drone。真正叫Drone的还有三个同名不同物:common/item/Drone.scala(drone物品)、common/container/Drone.scala(GUI 容器)、server/component/Drone.scala(Lua 组件)—— 这正是本 mod 最容易看错的地方。- 原「生成方式」写「使用 Drone Case(无人机外壳)生成」—— 错。Drone Case 只是组装配方里的外壳;实体由右键放置已组装好的
opencomputers:drone物品触发(common/item/Drone.scala:36-53)。- 原条目未说明本 mod 只注册了这 1 个实体,容易让人以为机器人(Robot)也是实体 —— 实际上 Robot 是方块
opencomputers:robot+ TileEntityRobotProxy,没有对应实体类。- 原「碰撞箱 / 重力 / 阻力 / 速度 / 加速度 / 免疫火焰」六项数值经核对全部正确(
Drone.scala:52-59),已补上对应行号。- 原「物品栏 8 槽」表述含糊 —— 实际是「组件槽数 = 无人机自身物品栏格数」加「另 8 格主物品栏」,已按
Drone.scala:57/83/113拆开写明。- 原「潜行 + 右键(未运行)启动 Drone」漏了前置条件「且未手持扳手」,两个潜行分支是互斥的(
Drone.scala:476-484),已按源码补全。