TileEntityDungeonSpawner(月球地下城 Boss 刷怪笼)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Dungeon Boss Spawner |
GalacticraftCore.java:719 |
| 所属 modid | GalacticraftCore |
core/Constants.java:7,@Mod 见 GalacticraftCore.java:160-161 |
| 关联方块 | micdoodle8.mods.galacticraft.core.blocks.BlockBasicMoon |
core/blocks/BlockBasicMoon.java:272-274 |
| 触发条件 | 方块 metadata 等于 15 才创建本 TE,其余 metadata 返回 null |
core/blocks/BlockBasicMoon.java:272-277 |
| 父类 | TileEntityAdvanced |
core/tile/TileEntityAdvanced.java:23 |
| 实现接口 | 无(类声明 :23 不带 implements) |
core/tile/TileEntityDungeonSpawner.java:23 |
| 槽位数 | 无(不实现 IInventory,源码中不存在 getSizeInventory()) |
core/tile/TileEntityDungeonSpawner.java:23-208 |
⚠ 本类不是抽象基类,也不是未注册的类——它有无参构造器
(core/tile/TileEntityDungeonSpawner.java:35-37),且确实被 GameRegistry 注册。
但它不是玩家能拿到的刷怪笼:创造模式物品列表里
BlockBasicMoon 只加 metadata 14(core/blocks/BlockBasicMoon.java:265-268),
metadata 15 的这一格拿不到。它由世界生成器放置:
core/world/gen/dungeon/RoomBossMoon.java:118-125 在 Boss 房生成时 setTileEntity。
字段
core/tile/TileEntityDungeonSpawner.java:25-33:
| 字段 | 类型 | 含义 | 来源 |
|---|---|---|---|
bossClass |
Class<? extends IBoss> |
要刷的 Boss 类 | core/tile/TileEntityDungeonSpawner.java:25 |
boss |
IBoss |
已生成的 Boss 实例 | core/tile/TileEntityDungeonSpawner.java:26 |
spawned |
boolean |
是否已刷出过 | core/tile/TileEntityDungeonSpawner.java:27 |
isBossDefeated |
boolean |
Boss 是否已击败 | core/tile/TileEntityDungeonSpawner.java:28 |
playerInRange / lastPlayerInRange |
boolean |
玩家在房内 / 上一 tick 是否在房内 | core/tile/TileEntityDungeonSpawner.java:29-30 |
playerCheated |
boolean |
作弊标记(玩家瞬移进房会被重置进度) | core/tile/TileEntityDungeonSpawner.java:31 |
roomCoords / roomSize |
Vector3 |
Boss 房范围;为 null 时 updateEntity 直接 return |
core/tile/TileEntityDungeonSpawner.java:32-33、:47-49 |
默认 Boss 是 EntitySkeletonBoss(:35-37 委托给 :39-41)。
tick 逻辑
updateEntity(:43-130)每 tick 依次做 6 件事:
| 步骤 | 搜索范围 | 来源 |
|---|---|---|
| 认领已存在的 Boss 实例 | 以自身为心 ±15 的 AABB | core/tile/TileEntityDungeonSpawner.java:53-61 |
| 清理被禁用的普通怪 | 房间范围**向负方向扩 4、**正方向扩 3 的 AABB | core/tile/TileEntityDungeonSpawner.java:72-80 |
| 反射构造 Boss(未生成且未击败时) | 用 getConstructor(World.class) |
core/tile/TileEntityDungeonSpawner.java:88-97 |
| 查玩家 | 房间本体 AABB | core/tile/TileEntityDungeonSpawner.java:99-107 |
| 刷出 Boss | 仅在玩家刚进入(playerInRange && !lastPlayerInRange)且 boss != null && !spawned 时 |
core/tile/TileEntityDungeonSpawner.java:118-126 |
| 作弊回滚 | playerCheated 且房内有玩家 → 重置 isBossDefeated/spawned/lastPlayerInRange |
core/tile/TileEntityDungeonSpawner.java:109-114 |
playSpawnSound(:132)在基类是空实现。
会被清除的生物
getDisabledCreatures()(:134-141)固定返回 4 种,进房时 setDead()(:82-86):
EntityEvolvedSkeleton、EntityEvolvedCreeper、EntityEvolvedZombie、EntityEvolvedSpider。
GUI / Container
无。 本类没有 onActivated / openGui 调用,core/client/gui/GuiHandler.java 也无对应分支。
网络封包
isNetworkedTile() 返回 false(:204-207),
getPacketRange() 返回 0(:194-197)、getPacketCooldown() 返回 0(:199-202)。
即完全不走 TileEntity 同步,状态只靠 NBT 持久化。
NBT 键:spawned(:153/:178)、playerInRange(:154/:179)、
defeated(:155/:180)、playerCheated(:156/:181)、
bossClass(存 getCanonicalName(),:182;读时 Class.forName :159)、
房间坐标与尺寸 6 个 double(:164-171/:184-191)。