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,服务端):

  1. 命中 Material.grass 且 playerTarget != null ⇒ 调 Items.dye.onItemUse(new ItemStack(Items.dye, 1, 15), playerTarget, ...) —— 元数据 15 是骨粉,效果是就地种出一棵树苗(:107-109);
  2. 命中方块 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)。

相关条目