Projectiles

基本信息

属性 值
已注册实体 5 个(EntityRegistry.registerModEntity,ProjectileEntityHandler.java:12-16)
未注册的投射物类 2 个(DisposableTurretProjectile、FerroSlugProjectile)
抽象基类 openmodularturrets.entity.projectiles.TurretProjectile extends EntityThrowable
伤害源 NormalDamageSource、ArmorBypassDamageSource(entity/projectiles/damagesources/)
客户端渲染 openmodularturrets.client.render.renderers.projectiles.ProjectileRenderers

已注册实体

ProjectileEntityHandler.registerProjectiles 注册 5 个实体,ID 1 – 5,均 updateFrequency = 16、sendVelocityUpdates = true:

ID 实体类 注册名 发射方
1 RocketProjectile rocketProjectile Rocket Launcher Turret
2 GrenadeProjectile grenadeProjectile Grenade Launcher Turret
3 BulletProjectile bulletProjectile Gun Turret
4 LaserProjectile laserProjectile Laser Turret
5 BlazingClayProjectile blazingClayProjectile Incendiary Turret

来源:ProjectileEntityHandler.java:12-16。追踪频率:ID 1 为 16, 1,其余 4 个为 16, 5。

未注册的投射物类

以下 2 个类继承自 TurretProjectile 但没有 registerModEntity 调用:

类 发射方 客户端渲染 证据
DisposableTurretProjectile Disposable Item Turret(DisposableItemTurretTileEntity.java:56)、Potato Cannon Turret(PotatoCannonTurretTileEntity.java:57) ProjectileRenderers.java:18:registerEntityRenderingHandler(DisposableTurretProjectile.class, new ItemProjectileRenderer(null)) grep -rn 'registerModEntity' src/ 全仓仅 ProjectileEntityHandler.java 的 5 处
FerroSlugProjectile Rail Gun Turret(RailGunTurretTileEntity.java:57) 未见对应 registerEntityRenderingHandler 同上

关于未注册实体:EntityRegistry.registerModEntity 为客户端-服务端同步提供实体 ID 分配与追踪。未注册的 Entity 在多人游戏中无法正确跨网络生成/追踪。本条仅陈述源码事实(注册表中确无这两项),不推断其运行时表现。

伤害源

openmodularturrets.entity.projectiles.damagesources 下有 2 个 DamageSource 子类:

伤害源 用途 效果
NormalDamageSource 常规伤害 90% 伤害走此源(GrenadeProjectile.java:59)
ArmorBypassDamageSource 穿甲伤害 手雷的 10% 伤害(GrenadeProjectile.java:59,68);铁磁弹的全部伤害(FerroSlugProjectile.java:78,86)

ArmorBypassDamageSource 的构造参数是伤害类型字符串("grenade" / "ferroslug")。

数值

投射物 AOE 半径 爆炸力 引爆条件 特殊
GrenadeProjectile 3 格 0.1F ticksExisted >= 50 伤害 = 配置伤害 × 0.9(Normal)+ × 0.1(ArmorBypass);hurtResistantTime = 0 强制生效
RocketProjectile 5 格 0.1F onImpact,追踪开启时忽略前 5 tick 命中、未开启时忽略前 2 tick 存活 100 tick 后自毁
BulletProjectile 无 AOE — — 渲染贴图为 Throwable Bullet
GrenadeProjectile 见上 — — 渲染贴图为 Throwable Grenade
LaserProjectile 无 AOE — — 不使用弹药
BlazingClayProjectile 点燃 AOE — — 设为燃烧
DisposableTurretProjectile 无 AOE — — 发射任何方块/物品或土豆
FerroSlugProjectile 无 AOE — — 100% 穿甲

客户端渲染(ProjectileRenderers.java:16-28,共 6 个 registerEntityRenderingHandler):

实体 渲染器
DisposableTurretProjectile ItemProjectileRenderer(null)
RocketProjectile RocketRenderer
BulletProjectile RenderSnowball(Items.bulletThrowable)
GrenadeProjectile RenderSnowball(Items.grenadeThrowable)
BlazingClayProjectile RenderSnowball(Items.blazingClayCraftable)
LaserProjectile LaserRenderer

FerroSlugProjectile 没有对应的渲染器注册(6 个注册覆盖了其余 6 个投射物类,独缺铁磁弹)。BlazingClayProjectile 用的是真正的弹药物品 Ammo - Blazing Clay,而非渲染专用物品。

来源:GrenadeProjectile.java:30-42(爆炸 + AABB ±3 + createExplosion(..., 0.1F, true))、:59,68(伤害拆分)、RocketProjectile.java:73-100(命中判定 + 爆炸 + AABB ±5)、RocketProjectile.java:45-46(100 tick 自毁)。

伤害放大附加件:GrenadeProjectile 在 isAmped 时按目标当前血量加伤 —— damage += ((int) elb.getHealth() * (0.25 * amp_level))(GrenadeProjectile.java:50-53),对应 Addon - Damage Boost。

回收附加件:TurretHeadUtil 的供弹逻辑在负数扣除(生成弹药)与正常扣除之间按概率分流(TurretHeadUtil.java:630-641)。

交互

触发 行为
命中生物 结算伤害;GrenadeProjectile 显式置 hurtResistantTime = 0 使伤害立即生效(:60、:70)
击杀 turretBase.onKill(elb) 累加底座的 killCount(GrenadeProjectile.java:64,72)
命中方块 火箭遇到非固体方块会穿过不引爆(RocketProjectile.java:80-89)

死亡信息未注册:en_US.lang 中有 6 条 death.attack.* 条目(disposable / bullet / blazingclay / grenade / rocket / laser / ferroslug),但全仓 grep -rn 'getDeathMessage|setDeathMessage|registerLocalizedDeathMessage' --include=*.java src/ 0 命中 —— 没有任何 DamageSource 调用注册本地化死亡信息的方法。这些 lang 条目属于死条目。

相关条目