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)。

相关条目