tfnaturebolt(自然法弹)
事实基准:
/Users/evlos/a/mirror/twilightforest(minecraftVersion = 1.7.10)逐行读源码。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 注册实体名 | TwilightForest:tfnaturebolt(全小写无空格,内部名) |
TwilightForestMod.java:777-784 |
| 实体 ID 常量 | idVehicleSpawnNatureBolt = 1(源码注释:non-configurable,不会冲突) |
TwilightForestMod.java:178 |
| 注册形式 | EntityRegistry.registerModEntity 直调,不经 TFCreatures |
TwilightForestMod.java:777 |
| 追踪距离 / 更新频率 / 速度同步 | 150 / 5 / true | TwilightForestMod.java:782-784 |
| 刷怪蛋 | 无 | 直调注册不进 TFCreatures.entityEggs |
| 类 | twilightforest.entity.EntityTFNatureBolt(136 行) |
entity/EntityTFNatureBolt.java:19 |
| 父类 | net.minecraft.entity.projectile.EntityThrowable |
同上 :19 |
| 渲染 | RenderSnowball(Items.wheat_seeds) —— 借用了原版雪球渲染器 |
client/TFClientProxy.java:309 |
| 发射者 | 骷髅德鲁伊、Adherent、EntityAITFMagicAttack |
EntityTFSkeletonDruid.java:215、EntityTFAdherent.java:99、ai/EntityAITFMagicAttack.java:133 |
| 所属结构 | 不属于任何结构,是敌人 AI 的通用魔法弹 | — |
注册名
tfnaturebolt是 mod-spawn 内部名,没有语言文件条目 (lang/en_US.lang检索不到该键)。
数值
| 属性 | 值 | 来源 |
|---|---|---|
重力 getGravityVelocity |
0.003F(极低,近似直线飞行) | EntityTFNatureBolt.java:46-48 |
| 实体伤害 | 2 | EntityTFNatureBolt.java:71 |
| 伤害来源 | DamageSource.causeIndirectMagicDamage(this, this.getThrower()) |
EntityTFNatureBolt.java:71 |
| 中毒时长(和平) | 0(不加) | EntityTFNatureBolt.java:73-74 |
| 中毒时长(普通) | 3 秒(3 * 20 tick) |
同上 |
| 中毒时长(困难) | 7 秒(7 * 20 tick) |
同上 |
| 拖尾粒子 | happyVillager × 5(每 tick) |
EntityTFNatureBolt.java:53-60 |
| 撞击粒子 | blockcrack_<leaves>_0 × 8,带高斯偏移 |
EntityTFNatureBolt.java:85-94 |
| 初速 / 精度(发射方设定) | 速度 0.6F、精度 6.0F | EntityTFSkeletonDruid.java:224 |
maxHealth / 伤害 / 速度属性 |
不适用 —— EntityThrowable 系无 applyEntityAttributes;本类全文无属性设置 |
— |
AI 行为 / 特殊机制
只伤生物(onImpact,:65-83):仅当 entityHit instanceof EntityLivingBase
才结算伤害,命中方块不造成任何伤害。伤害成功后才加中毒。
命中方块的「自然爆发」(:96-114,服务端):
- 命中
Material.grass且playerTarget != null⇒ 调Items.dye.onItemUse(new ItemStack(Items.dye, 1, 15), playerTarget, ...)—— 元数据 15 是骨粉,效果是就地种出一棵树苗(:107-109); - 命中方块
isSolid()且canReplaceBlock通过 ⇒ 直接worldObj.setBlock(dx, dy, dz, Blocks.leaves, 2, 3)放置树叶方块(:110-112)。
可替换判定(canReplaceBlock,:118-128):要求方块硬度 >= 0 且 < 50,
作者注释自嘲「这个判断意外地难搞」(:119)。第 123 行
// int meta = worldObj.getBlockMetadata(...) 是注释掉的死代码。
playerTarget 只认玩家(setTarget,:130-134):只有
attackTarget instanceof EntityPlayer 时才记录,否则字段留 null,
于是上面的骨粉种树分支不会触发。
召唤/爆炸各一次 setDead::96-97 无条件 setDead(),
之后 :99 才开始读 MovingObjectPosition 做方块改造 —— 顺序无害但略反直觉。
AI 侧设定:骷髅德鲁伊发射时瞄准点取目标 posY + getEyeHeight() - 2.7,
并按水平距离加 20% 抬升补偿(EntityTFSkeletonDruid.java:220-224)。
相关条目
- Skeleton Druid(骷髅德鲁伊) - 持锄时改用本弹做远程攻击
- Adherent(追随者) - 另一个使用本弹的敌人
- Lich Bolt(巫妖魔弹) - 结构相近的另一种魔法弹