Turret Head TileEntity

基本信息

属性 值
抽象基类 openmodularturrets.tileentity.turrets.TurretHead
等级子类 10 个,见下表
注册数量 10 个(TileEntityHandler.java:37-42 与 :48-51)
辅助类 openmodularturrets.tileentity.turrets.InvisibleTurretHelperEntity(索敌辅助实体)
父类 openmodularturrets.tileentity.TileEntityOMT

注意:10 种炮塔头的 TileEntity 全部无条件注册,与方块不同 —— 方块的注册受配置开关保护(见 Turret Heads),但 TileEntityHandler 里这 10 行 registerTileEntity 不在任何 if 中。关闭某炮塔时对应方块不注册,其 TileEntity 注册成为无用条目,但不会报错。

注册名对照

TileEntity 类 registerTileEntity 名称
TurretBase turretbase
TurretBaseTierOneTileEntity turretWoodBase
DisposableItemTurretTileEntity disposableItemTurret
PotatoCannonTurretTileEntity potatoCannonTurret
RocketTurretTileEntity rocketTurret
GunTurretTileEntity machineGunTurret
GrenadeLauncherTurretTileEntity grenadeTurret
LaserTurretTileEntity laserTurret
RailGunTurretTileEntity railGunTurret
IncendiaryTurretTileEntity incendiaryTurret
RelativisticTurretTileEntity relativisticTurret
TeleporterTurretTileEntity teleporterTurret

来源:TileEntityHandler.java:35-51(曲柄 LeverTileEntity 在 :43)。

功能

TurretHead.updateEntity(TurretHead.java:225-265)是所有炮塔共用的逐 tick 骨架:

  1. setSide() — 记录贴附在底座的哪一面
  2. this.base = getBase()(:226)— 反查底座
  3. 客户端分支:updateRotationAnimation() 后立即返回
  4. 每 5 tick markBlockForUpdate 同步朝向
  5. 存活检查:if (base == null || base.getBaseTier() < this.turretTier) → this.getWorldObj().func_147480_a(xCoord, yCoord, zCoord, true) 自毁(:240-241)
  6. 若底座开启攻击玩家且炮塔激活 → TurretHeadUtil.warnPlayers(...) 广播警告(:243-250)
  7. TurretHeadUtil.updateSolarPanelAddon(base) 结算太阳能附加件(:252)
  8. concealmentChecks() 处理伪装附加件(:254)
  9. if (!base.isActive()) return;(:257)
  10. 索敌节流:无目标时按 ConfigHandler.getTurretTargetSearchTicks() 累加 targetingTicks 后提前返回(:262-265)

依赖注入:TurretHead 不直接读配置数值,而是通过 TurretHeadUtil 的静态方法取升级加成(getRangeUpgrades / getScattershotUpgrades / getAccuraccyUpgrades / getEfficiencyUpgrades / getFireRateUpgrades),再与 炮塔配置 的基线值组合。

投射物工厂:每个子类覆写一个返回投射物的工厂方法,例如 DisposableItemTurretTileEntity.java:56 与 PotatoCannonTurretTileEntity.java:57 都 return new DisposableTurretProjectile(world, ammo, this.getBase()),RailGunTurretTileEntity.java:57 返回 new FerroSlugProjectile(world, ammo, this.getBase())。

Teleporter Turret 额外覆写了存活检查(TeleporterTurretTileEntity.java:44),Relativistic Turret 亦然(RelativisticTurretTileEntity.java:45)—— 两者的实现与基类 TurretHead.java:240 重复。

数值

数值名 值
turretTier 取值 1 – 5(各子类构造函数内硬编码,非配置)
朝向同步间隔 5 tick
索敌节流间隔 GlobalTargetingParameters/If a turret does not have a target, how many ticks should it wait before looking again?,默认 10 tick
火箭存活上限 100 tick(RocketProjectile.onEntityUpdate)
Relativistic 施加的负面效果 Potion.moveSlowdown 200 tick 等级 5 + Potion.weakness 200 tick 等级 5(RelativisticTurretTileEntity.java:111-112)
Teleporter 最小射程 3 格(取自模组自带 wiki teleporterTurret.txt)

Teleporter 最小射程 3 格只由模组自带 wiki 文本佐证(assets/openmodularturrets/wiki/en_US/block/teleporterTurret.txt:“Note that this turret has a minimum range of 3 blocks.”)。TeleporterTurretTileEntity.java 中没有对应的 3 字面量或钳制逻辑 —— 实际生效的射程仍来自配置 TurretTeleporter/Range(默认 20)。此条以 wiki 原文标注,不视为已从代码核实。

交互

触发 行为
无 GUI 炮塔头的全部配置在底座 GUI(ID 6)中完成
底座移除或等级不足 下一 tick 自毁
玩家接近 触发 warnPlayers 警告(受底座开关与 GlobalTargetingParameters/Can turrets attack players? 双重控制)

相关条目