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 条目属于死条目。
相关条目
- Turret Heads - 发射方
- Ammo - 弹药与渲染专用物品