Yeti(雪怪)
事实基准:
/Users/evlos/a/mirror/twilightforest(minecraftVersion = 1.7.10)逐行读源码。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 注册实体名 | TwilightForest:Yeti |
TwilightForestMod.java:692 |
| 实体 ID 常量 | idMobYeti = 225 |
TwilightForestMod.java:1127 |
| 蛋色 | 主 0xdedede / 副 0x4675bb |
TwilightForestMod.java:692 |
| 注册形式 | TFCreatures.registerTFCreature → 追踪 80 / 更新 3 |
TFCreatures.java:23、TwilightForestMod.java:692 |
| 类 | twilightforest.entity.EntityTFYeti(303 行) |
entity/EntityTFYeti.java:26 |
| 父类 | net.minecraft.entity.monster.EntityMob |
同上 :26 |
| 体型 | setSize(1.4F, 2.4F) |
同上 :32 |
| 所属结构 | 雪怪洞穴(特性 ID 17),权重 10、4~4 只 | TFFeature.java:196 |
| 群系刷怪 | 雪地群系刷怪表,权重 20、4~4 只 | biomes/TFBiomeSnow.java:52 |
注册名是
Yeti(雪怪),塔主是另一个类EntityTFYetiAlpha,注册名Yeti Boss(TwilightForestMod.java:693-697)—— 见 Alpha Yeti。两个类不要混。
数值
| 属性 | 值 | 来源 |
|---|---|---|
maxHealth |
20.0 | EntityTFYeti.java:58 |
movementSpeed |
0.38 | 同上 :59 |
attackDamage |
0.0 | 同上 :60 |
followRange |
4.0(平静时),被攻击后升到 40.0 | 同上 :61、:160 |
骑乘高度 getMountedYOffset |
2.25 | 同上 :199-201 |
| 骑乘位置偏移 | 朝向前方 0.4F | 同上 :206-216 |
getDropItem |
TFItems.arcticFur |
同上 :275-277 |
| DataWatcher 索引 | ANGER_FLAG = 16 |
同上 :28、:66 |
| 追踪距离 / 更新频率 | 80 / 3 | TFCreatures.java:23 |
attackDamage刻意设为 0.0 —— 雪怪本身不造成任何直接伤害(见下「抓取」)。EntityTFYetiAlpha的attackDamage是另一套值,不在本条目。
AI 行为 / 特殊机制
抓取而非攻击:attackEntityAsMob 覆写 —— 当自己无人骑乘且目标也没骑乘其它实体时,
播放 TwilightForest:mob.yeti.grab(音量 4F,音高 0.75 + rand × 0.25)并
par1Entity.mountEntity(this)(:124-132)。配合 attackDamage = 0.0,
雪怪不造成任何直接伤害,它只是把人抓起来。
强制驮运:onLivingUpdate 每 tick 检查 riddenByEntity,若其在潜行就
setSneaking(false),玩家无法用潜行键下车(:73-101)。同时 setLookHelper
锁定骑乘者(:92-93),并用 func_145771_j 把玩家从方块里推出来(:97-98)。
扔下玩家:EntityAITFThrowRider(this, 1.0F)(优先级 1,:35)在骑乘者存在时
以 1/5 概率触发(EntityAITFThrowRider.java:30-35),让骑乘者脱离并获得
(视线方向 × 2, y = 0.9) 的速度,对 EntityPlayerMP 另发
TFGenericPacketHandler.makeThrowPlayerPacket 同步(EntityAITFThrowRider.java:37-60)。
由于潜行已被禁,玩家只能等雪怪自己把你甩下来。
愤怒机制:attackEntityFrom 覆写 —— 只要 DamageSource.getEntity() != null
(任何有攻击者的伤害,不只是玩家)就 setAngry(true)(:137-144),
把 followRange 从 4.0 提到 40.0 并置位 DataWatcher 标志(:156-165)。
NBT 键 Angry 持久化(:170-181)。
坐骑接口:updateRiderPosition 把骑乘者放到 getRiderPosition()(本体正前方 0.4F、
高 2.25)(:186-193、:206-220),canRiderInteract() 返回 true(:227-229)。
interact 的「允许玩家主动上马」分支被注释掉(:106-119),所以只能被抓上去。
雪地无视光照:getCanSpawnHere 与 isValidLightLevel 双双覆写 ——
群系为 TFBiomeBase.tfSnow 时跳过光照检查(:246-273)。
寻路:构造函数第一行就是 getNavigator().setAvoidsWater(true)(:34)。
任务表(:35-41):1 EntityAITFThrowRider(1.0F);
2 EntityAIAttackOnCollide(EntityPlayer, 1.0D, false);3 EntityAIWander(1.0F);
4 被占用两次 —— EntityAIWatchClosest(8.0F) 与 EntityAILookIdle(后者覆盖前者)。
目标表:1 EntityAIHurtByTarget(false)、
2 EntityAINearestAttackableTarget(EntityPlayer, 0, true, false)(最后一个 false
表示不检查同队伍)。
被寒冰炸弹秒杀:EntityTFIceBomb.hitNearbyEntities 对 EntityTFYeti 有特判 ——
直接 setDead() 并在原位放两层 Blocks.ice,源码 TODO 写着「想做一个 frozen yeti 实体」
(entity/boss/EntityTFIceBomb.java:160-172)。普通雪怪吃到爆炸即死,
只有 EntityTFYetiAlpha 有豁免(EntityTFFallingIce.java:141)。
成就:暮色森林维度内被玩家击杀触发 twilightHunter(:234-241)。
声音:TwilightForest:mob.yeti.growl / mob.yeti.hurt / mob.yeti.death(:279-301)。
相关条目
- Alpha Yeti(阿尔法雪怪) - 注册名
Yeti Boss,雪怪洞穴塔主 - Winter Wolf(寒冬狼) - 同雪地群系
- Arctic Fur(极地毛皮) - 唯一掉落物
- Ice Bomb(寒冰炸弹投射物) - 命中即秒杀本实体