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)。

相关条目