实体(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

相关条目