实体(10 个)
基本信息
OpenBlocks 不用 @RegisterEntity 注解(全仓库 grep 该注解命中 0 次),而是在 init 阶段手写 EntityRegistry.registerModEntity(OpenBlocks.java:637-698)。实体 ID 常量在 OpenBlocks.java:232-241。
| # | 实体 ID | 注册名 | 类 | 行 |
|---|---|---|---|---|
| 1 | 701 | Hang Glider |
EntityHangGlider |
OpenBlocks.java:232、:647-654 |
| 2 | 702 | Luggage |
EntityLuggage |
OpenBlocks.java:233、:637-638 |
| 3 | 703 | Magnet |
EntityMagnet |
OpenBlocks.java:234、:655-656 |
| 4 | 704 | MountedBlock |
EntityMountedBlock |
OpenBlocks.java:235、:657-664 |
| 5 | 705 | Cartographer |
EntityCartographer |
OpenBlocks.java:236、:665-672 |
| 6 | 706 | EntityItemProjectile |
EntityItemProjectile |
OpenBlocks.java:237、:673-680 |
| 7 | 707 | GoldenEye |
EntityGoldenEye |
OpenBlocks.java:238、:681-688 |
| 8 | 708 | Player-Magnet |
EntityMagnet.PlayerBound |
OpenBlocks.java:239、:665-672 |
| 9 | 709 | XPOrbNoFly |
EntityXPOrbNoFly |
OpenBlocks.java:240、:639-646 |
| 10 | 710 | MiniMe |
EntityMiniMe |
OpenBlocks.java:241、:697-698 |
注册顺序不等于 ID 顺序:registerModEntity 的实际调用顺序是 Luggage(702) → XPOrbNoFly(709) → HangGlider(701) → Magnet(703) → MountedBlock(704) → Player-Magnet(708) → Cartographer(705) → EntityItemProjectile(706) → GoldenEye(707) → MiniMe(710)(OpenBlocks.java:637-698)。按表头 ID 排序读会得到错误的对应关系。
EntityMagnet.PlayerBound是EntityMagnet的静态内部类,占用了独立 ID 708(OpenBlocks.java:665-672)。
功能
滑翔翼(EntityHangGlider)
玩家乘坐的滑翔翼实体。软依赖两处:
- Backhand:
private static final boolean isBackhandLoaded = Loader.isModLoaded("backhand")(EntityHangGlider.java:55),存在时处理副手切换(:79) - Et Futurum:
ModPresence.ET_FUTURUM && player instanceof IElytraPlayer(:167、:172)——存在时接管鞘翅
ClientProxy 在 init 里注册了 EntityMiniMe.OwnerChangeHandler 到 Forge 事件总线(ClientProxy.java:147)。
磁铁(EntityMagnet + EntityMagnet.PlayerBound)
吸方块与实体的磁力球。只有 3 处真实创建点:
| 创建点 | 用途 | 行 |
|---|---|---|
CraneRegistry |
起重机磁铁 | CraneRegistry.java:57(new EntityMagnet.PlayerBound(...)) |
MagnetControlAdapter |
OpenPeripheral 海龟升级 | MagnetControlAdapter.java:166(new EntityMagnet(world, magnetOwner, true)) |
| 渲染 | 仅注册渲染器 | ClientProxy.java:256 |
MagnetWhitelists 提供方块/实体/TileEntity 的可吸白名单,并以 EntityRegisterEvent 形式投到 Forge 事件总线(MagnetWhitelists.java:83、:128)。三个白名单事件类分别是 EntityRegisterEvent(MagnetWhitelists.java:83)、TileEntityRegisterEvent(:97)与同文件内第三个同级 WhitelistRegisterEvent 子类。
物品投射物(EntityItemProjectile)
物品炮发射的抛射物,唯一创建点是 TileEntityCannon(TileEntityCannon.java:132)。真空漏斗只在它 motionY < 0.01(下落中)时吸收(TileEntityVacuumHopper.java 的 isEntityApplicable)。
经验球(EntityXPOrbNoFly)
原版 EntityXPOrb 的子类,不飞行——由喷经验浴生成(TileEntityXPShower.java:55-70 内逐个 spawnEntityInWorld),所以堆在原地等玩家捡。
克隆体(EntityMiniMe)
玩家形象的克隆实体。唯一创建点是金蛋孵化:new EntityMiniMe(worldObj, Objects.firstNonNull(owner, MR_GLITCH))(TileEntityGoldenEgg.java:237),无主时归属回退到常量 MR_GLITCH。渲染器注册在 ClientProxy.java:261。
EntityMiniMe.OwnerChangeHandler 在客户端 init 注册(ClientProxy.java:147)——这是一个 class 存在且被注册、但没有显式调用 init() 的例子:ClientProxy.init() 由 @SidedProxy 的 FML 生命周期调用,而不是 OpenBlocks 自己调。行为正确,但调用点在 FML 而非本仓库。
渲染注册
客户端 registerRenderInformation 里注册渲染器,例:RenderingRegistry.registerEntityRenderingHandler(EntityMagnet.class, new EntityMagnetRenderer())(ClientProxy.java:256)、EntityMiniMeRenderer(ClientProxy.java:261)。
数值
| 数值名 | 来源 | 值 |
|---|---|---|
| 实体 ID 区间 | 硬编码 | 701 ~ 710(OpenBlocks.java:232-241) |
| 实体总数 | 硬编码 | 10(OpenBlocks.java:637-698) |
| 跟踪范围参数 | 全部为 64 |
10 处 registerModEntity 第三/四参(OpenBlocks.java:637-698) |
| 更新频率参数 | 全部为 1 |
同上 |
| 磁铁真实创建点 | grep new EntityMagnet |
2 处(CraneRegistry.java:57、MagnetControlAdapter.java:166) |
| 投射物真实创建点 | grep new EntityItemProjectile |
1 处(TileEntityCannon.java:132) |
| 克隆体真实创建点 | grep new EntityMiniMe |
1 处(TileEntityGoldenEgg.java:237) |
计数核对:
ENTITY_*_ID常量(OpenBlocks.java:232-241)共 10 个,EntityRegistry.registerModEntity调用(OpenBlocks.java:637-698)共 10 次,两者一致。
common/entity/目录下共 12 个.java文件(common/entity/ai/另有 3 个)。其中 3 个不在任何 ID 列表中:EntityAssistant、EntityMount、EntitySmoothMove——它们是被其它实体内部使用的辅助类,未注册。于是 12 − 3 = 9 个注册用类,而注册数是 10——差额来自
EntityMagnet一个类占了两个 ID(Magnet= 703 与PlayerBound= 708)。9 + 1 = 10,吻合。
交互
| 触发 | 行为 |
|---|---|
| 磁铁生成 | 吸走 MagnetWhitelists 允许的方块与实体 |
| 物品炮发射 | 生成 EntityItemProjectile(TileEntityCannon.java:132) |
| 喷经验浴脉冲 | 生成一批 EntityXPOrbNoFly |
| 金蛋孵化 | 生成归属为孵化者的 EntityMiniMe(TileEntityGoldenEgg.java:237) |
| 滑翔翼 + Et Futurum | 鞘翅被滑翔翼接管(EntityHangGlider.java:172) |
| 背包 / 箱子装入实体 | 多数实体用 EntityItem 包装;行李箱走 LuggageDropHandler |
相关条目
- 方块 / 设备类方块 - 物品炮与金蛋的产出
- 方块 / 自动化设备 - 真空漏斗吸收投射物
- 方块 / 经验类方块 - 喷经验浴产出经验球
- 集成 / 外部模组 - 磁铁与海龟升级